为什么stat返回错误的结果?

时间:2015-05-01 19:17:30

标签: c stat

我想使用stat检查给定的参数是否是目录。该程序有两个参数:当第一个参数不是目录或它不存在时,代码可以正常工作。

但是当第一个参数是一个目录并且存在,并且第二个参数不存在时,程序说它们都存在 - 结果错误。我想知道为什么它不起作用。

#include <stdio.h>
#include <sys/stat.h>


int main(int n, char **argv)
{
    char *dir_1=argv[1], *dir_2=argv[2];


    if (is_dir(dir_1) == 0)
            printf("Directory %s exists.\n", dir_1);
    else
            printf("Directory %s does not exist.\n", dir_1);

    if (is_dir(dir_2) == 0)
            printf("Directory  %s exists.\n", dir_2);
    else
            printf("Directory  %s does not exist.\n", dir_2);

}


int is_dir(char *file)
{
        struct stat file_stat;
        stat(file, &file_stat);
        return( (S_ISDIR(file_stat.st_mode)) ? 0 : -1);
}

1 个答案:

答案 0 :(得分:1)

这个答案是接着被接受了。 MSVC中不存在 [self.parentView addConstraint:self.constraintX]; ,而是S_ISDIR。替换后,编译器通知_S_IFDIR没有返回值。原因是,is_dir()是一个掩码,而不是一个函数。因此,在对代码进行一些调整之后,我得到了这个有效。

_S_IFDIR

节目输出:

#include <stdio.h>
#include <sys/stat.h>

int is_dir(char *file)
{
    struct stat file_stat;
    if (stat(file, &file_stat) == 0)                    // check it worked
        return file_stat.st_mode & _S_IFDIR;            // it's a status mask
    return 0;
}

int main(int argc, char **argv)                         // conventional ids
{
    char *dir_1, *dir_2;
    if (argc < 3) return 0;                             // check silliness
    dir_1=argv[1];
    dir_2=argv[2];

    if (is_dir(dir_1))                                  // reversed the logic
        printf("%s is a Directory.\n", dir_1);
    else
        printf("%s is not a Directory.\n", dir_1);      // better text

    if (is_dir(dir_2))
        printf("%s is a Directory.\n", dir_2);
    else
        printf("%s is not a Directory.\n", dir_2);
    return 0;
}

反之亦然:

>test test.c wtest
test.c is not a Directory.
wtest is a Directory.