【问题标题】:List Current Directory and File Types (Dir, Reg, Lnk) in C Language using Stat and OpenDir()/ReadDir()使用 Stat 和 OpenDir()/ReadDir() 列出 C 语言中的当前目录和文件类型(Dir、Reg、Lnk)
【发布时间】:2014-05-31 11:42:47
【问题描述】:

您好,感谢您的阅读。

我正在尝试用 C 语言构建一个在 Linux Shell 中运行的程序,它接受一个参数(目录)并列出该目录中的所有文件,以及它们是常规文件、链接文件还是目录.我需要使用 OpenDir()/ReadDir() 和 stat。到目前为止,这是我的代码:(我有点卡住了)目前它只读取一个文件并输出类型。如何让我的程序读取目录中的所有文件,并输出它们的名称以及它们是什么类型的文件?

 #define _BSD_SOURCE
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <time.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <dirent.h>
 #include <time.h>

   int
   main(int argc, char *argv[])
   {
       struct stat sb;

    /*
       if (argc != 2) {
           fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
           exit(EXIT_FAILURE);
       }*/

       if (stat(argv[1], &sb) == -1) {
           perror("stat");
           exit(EXIT_FAILURE);
       }



       switch (sb.st_mode & S_IFMT) {
       case S_IFBLK:  printf("block device\n");            break;
       case S_IFCHR:  printf("character device\n");        break;
       case S_IFDIR:  printf("dir ");                      break;
       case S_IFIFO:  printf("FIFO/pipe\n");               break;
       case S_IFLNK:  printf("lnk ");                      break;
       case S_IFREG:  printf("reg ");                      break;
       case S_IFSOCK: printf("socket\n");                  break;
       default:       printf("unknown?\n");                break;
       }

       printf("%s\n", argv[1]);

       exit(EXIT_SUCCESS);
   }

所以我重写了所有内容,现在我收到了一些关于它是链接 reg 文件还是 dir 文件的输出,但是我只收到文件是目录,即使它显然不是(文本文件或 . c 文件等)。这是新代码:

#define _BSD_SOURCE
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
  #include <sys/types.h>
       #include <time.h>
       #include <stdio.h>
       #include <stdlib.h>


void typeOfFile(struct stat info){

    if (S_ISREG(info.st_mode)) {
        printf("reg");
    }
    if (S_ISDIR(info.st_mode)) {
            printf("dir");
    }
    if (S_ISLNK(info.st_mode)) {
                printf("lnk");
    }

}

int main(int argc, char *argv[]) {

    DIR *dirp;
    struct dirent* dent;
    struct stat info;







typeOfFile(info);

//If no args
    if(argc == 1){

        argv[1] = ".";  
            dirp=opendir(argv[1]); // specify directory here: "." is the "current directory"
            do {
                dent = readdir(dirp);
                if (dent)
                {
//////////////////////////////////////////////////////////////////////////
                    if (stat(argv[1], &info) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }



           switch (info.st_mode & S_IFMT) {
           case S_IFBLK:  printf("block device\n");            break;
           case S_IFCHR:  printf("character device\n");        break;
           case S_IFDIR:  printf("dir ");                      break;
           case S_IFIFO:  printf("FIFO/pipe\n");               break;
           case S_IFLNK:  printf("lnk ");                      break;
           case S_IFREG:  printf("reg ");                      break;
           case S_IFSOCK: printf("socket\n");                  break;
           default:       printf("unknown?\n");                break;
           }


//////////////////////////////////////////////////////////////////////////
                    printf("%s \n", dent->d_name);

                }
            } while (dent);
            closedir(dirp);

       }



////////////////////////////////////////////////////////////////////////////////////////////////
//If specified directory    
    if(argc > 1){
        dirp=opendir(argv[1]); // specify directory here: "." is the "current directory"
        do {
            dent = readdir(dirp);
            if (dent)
            {

/////////////////////////////////////////////////////////////////////////////////////           
                if (stat(argv[1], &info) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }



           switch (info.st_mode & S_IFMT) {
           case S_IFBLK:  printf("block device\n");            break;
           case S_IFCHR:  printf("character device\n");        break;
           case S_IFDIR:  printf("dir ");                      break;
           case S_IFIFO:  printf("FIFO/pipe\n");               break;
           case S_IFLNK:  printf("lnk ");                      break;
           case S_IFREG:  printf("reg ");                      break;
           case S_IFSOCK: printf("socket\n");                  break;
           default:       printf("unknown?\n");                break;
           }
//////////////////////////////////////////////////////////////////////////////////////
//           printf("%s\n", argv[1]);


                printf("%s \n", dent->d_name);

            }
        } while (dent);
        closedir(dirp);

   } 
return 0;    
}

【问题讨论】:

  • 好的,但你的问题是什么?
  • 啊哈,对不起,我有点超前了,我已经用更清晰的问题编辑了帖子
  • 我想我正在为每一行打印文件类型的当前目录,这就是为什么它每次都是“Dir”。虽然不知道如何纠正..

标签: c linux stat opendir


【解决方案1】:

您的代码使用argv[1] 调用stat,它总是'.' - 因此所有项目都被错误地识别为目录。

dent-&gt;d_name(文件名)是这里的正确参数。

  if (stat(dent->d_name, &info) == -1) {

【讨论】:

  • 哦,哇,我真是太傻了……谢谢,完美!
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 2014-07-21
相关资源
最近更新 更多