【问题标题】:Reading current directory, printing results based on file attributes读取当前目录,根据文件属性打印结果
【发布时间】:2018-08-18 07:09:14
【问题描述】:

我在创建一个读取当前目录、打印文件路径和内容的 C 程序时遇到了一些麻烦。

对于在目录中找到的每个文件,应根据它们是目录、文件还是可执行文件来打印内容。

我的主要组件正在工作,只是不确定如何在使用 opendir() / closedir() 命令后对文件输出进行排序

例如。结束输出:

/home/documents/folder1
File:       help.txt
File:       me.txt
Executable: plz
File:       thankyou.c  

当前代码:

struct dirent *de;  // Pointer for directory entry

// opendir() returns a pointer of DIR type.
DIR *dir = opendir(".");//opens current direcotry

if (dir == NULL)  // opendir returns NULL if couldn't open directory
{
    printf("ERROR: Could not open current directory" );
    return 1;
}

// for readdir()
while ((de = readdir(dir)) != NULL){

      //if (Executable){}
      //else if (File){}
      //else if (Directory){}
        printf("%s\n", de->d_name);

【问题讨论】:

标签: c linux shell


【解决方案1】:

您可以使用struct dirent 中的d_type 来检查文件的类型,使用accessX_OK 来检查文件是否可执行。

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>

int main()
{
    DIR *dir;
    struct dirent *dp;
    char * file_name;
    dir = opendir(".");
    while ((dp=readdir(dir)) != NULL) {
        if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") )
        {
            // do nothing (straight logic)
        } else {
            file_name = dp->d_name; // use it
            if (access(file_name, X_OK) != -1) {
             printf("executable:");
            }
            else if (dp->d_type == DT_DIR)
            {
               printf("directory:");
            }
            else if(dp->d_type == DT_REG)
            {
               printf("file:");
            }
            printf("     \"%s\"\n",file_name);
        }
    }
    closedir(dir);
    return 0;
}

【讨论】:

  • 这是已经被多次询问和回答的问题之一,很难避免现有的答案。最好将其作为副本关闭。现有答案提供了更丰富的知识体系。比如你的程序对硬链接和软链接不敏感,无法回答可执行文件等问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2014-04-04
  • 1970-01-01
相关资源
最近更新 更多