0

我正在尝试查找某个路径是否是目录。

我正在使用<sys/stat.h>以下代码中的 stat 函数:

int  isDir(char *path){
    printf("%s\n", path);
    struct stat file;
    stat(path, &file);
    printf("%i\n", file.st_mode);
    int x; 
    x = S_ISDIR(file.st_mode);
    return x;
}
// I tried this function with the following code.
    printf("%i\n",  isDir("/home/aladdin"));
    printf("%i\n",  isDir("/home/aladdn"));

我在 PC 上的用户名是aladdin这样的,第一个应该 work 并且 equal 1,第二个应该打印 a 0,因为没有名为 的用户aladdn

所以运行前面的代码给出

/home/aladdin
16832
1
/home/aladdn
16832
1

知道出了什么问题吗?

4

1 回答 1

4

您必须检查统计返回码。如果 stat 失败,它不会修改你的文件结构内容,在这种情况下它 IS_DIR 似乎返回 true。

所以,而不是你的当前行stat(path, &file);,有行:

if (stat(path, &file) == -1) return 0;

...当然,您可能应该以某种方式报告错误,具体取决于您的要求,但是这个简单的更改将修复您的功能。

至于为什么会得到相同的结果,我认为 C 会留下未初始化的结构,除非您明确初始化它们,并且使用这种用法,结构将在第二次调用时位于堆栈中完全相同的位置,因此它仍然具有值从第一次通话开始。但这只是偶然,更改代码和行为会发生不可预测的变化。C 那样很有趣 :)

要将 buf 归零,请在使用 &file 调用 stat 之前执行此操作:

memset(&file, 0, sizeof file);

于 2012-10-21T16:13:32.147 回答