如何正确使用S_ISREG函数

时间:2019-04-06 11:52:13

标签: c stat readdir

编辑:在论坛提供了一些帮助之后,很明显,这个问题不是使用S_ISREG(),而是我使用lstat()。对不起误导性问题。

我正在寻找一个目录,并试图说出常规文件和子目录之间的区别。

我已经仔细研究了与此问题相关的其他人的问题,尽管有些相似,但没有一个人得到足够清晰的答案来修复我的代码。

    int find(char *argv)
    {
        DIR *pointerToDir;
        struct dirent *pointerToDirent;
        struct stat status;
        int mode;

        pointerToDir = opendir(argv);
        if(pointerToDir == NULL)
        {
            printf("Can't open that directory (or it doesn't exist)\n");
            closedir(pointerToDir);
            return 0;
        }
        else
        {
            while((pointerToDirent = readdir(pointerToDir)) != NULL)
            {
                lstat(pointerToDirent->d_name, &status);
                mode = S_ISREG(status.st_mode);
                if(mode != 0)
                    printf("%s must be a file\n", pointerToDirent->d_name);
                else
                    printf("%s must be a dir\n", pointerToDirent->d_name);
            }
            closedir(pointerToDir);
            return 0;
        }
    }

我向程序传递了一个包含2个子目录和2个常规文件的测试目录。布局将如下所示:

  

dir1

     
    
        
  • sub1
  •     
  • sub2
  •     
  • dir1.txt
  •     
  • test.c
  •     
  

现在,当我运行程序并将“ dir1”作为参数传递时,我希望它返回以下内容:

  

。必须是目录

     

..必须是目录

     

sub1必须为目录

     

dir1.txt必须是文件

     

sub2必须是一个目录

     

test.c必须是文件

但是,相反,它们返回的都是“目录”。我想念什么?

0 个答案:

没有答案