当多次调用时,stat函数不会改变它的值

时间:2012-10-21 16:10:31

标签: c

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

我使用以下代码使用<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,因此,第一个应该可以正常工作并且等于1,第二个应该打印0,因为没有用户名{{1} }}

所以运行前面的代码会给出

aladdn

对于什么是错的任何想法?

1 个答案:

答案 0 :(得分:4)

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

因此,不要使用当前行stat(path, &file);,而是行:

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

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

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

要将buf归零,请在使用&amp; file:

调用stat之前执行此操作

memset(&file, 0, sizeof file);