C:S_ISDIR无法正常工作,只有"。"和" .."显示为目录

时间:2014-04-08 07:45:57

标签: c string io

由于某种原因,当我遍历目录中的所有文件/文件夹,并检查我对S_ISDIR的当前选择时,它只适用于“。”和“..”目录。即使我有3个文件(A,B,C)和2个文件夹(subdir,seconddir)

代码:

//will read all files inside current directory, logic steps down into any sub directory found
int readDir(char * opt_basedir) // opt_basedir is the folder within the root repository of the .exe file, in this case "test"
{
struct dirent *dirr;

 DIR *directory; // used to keep track of current directory
struct stat fileStat; //used for lstat to hold stat info for the document
 directory = opendir("."); // open root
 directory = opendir(opt_basedir); // iterate straight into the selected folder


dirr = readdir(directory);
 while(dirr){

   lstat(dirr->d_name, &fileStat);

   if(S_ISDIR(fileStat.st_mode))
   {
      printf("only prints of . and .. =>" );
   }
    //if file (open)
    //readCopy(opt_basedir, &block, &offset);
    // else folder
    //function call
     printf("%s\n",dirr->d_name);
     dirr = readdir(directory);
 }


}

不确定我在这里做错了什么...... :(

2 个答案:

答案 0 :(得分:2)

您必须首先确保opt_basedir是您当前的工作目录。

您可以执行类似

的操作
chdir(opt_basedir);
directory = opendir(".");

而不是

directory = opendir(opt_basedir);

另一种方法是创建绝对路径:

directory = opendir(opt_basedir);
/* error check */

while ((dirr = readdir(directory))) {
    char *path = malloc(strlen(opt_basedir) + strlen(dirr->d_name) + 1);
    /* error check */
    strcpy(path, opt_basedir);
    strcat(path, dirr->d_name);

    lstat(path, ...);
    /* other code */

    free(path);
}

这是一个完整的测试程序(注意:readDir()中的输出仅用于调试):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>

void
readDir(const char *path)
{
    DIR *dp;
    struct dirent *dr;
    struct stat fs;

    dp = opendir(path);
    if (dp == NULL) {
        perror("opendir");
        return;
    }

    printf("%s:\n", path);
    while ((dr = readdir(dp))) {
        if (!strcmp(dr->d_name, ".") || !strcmp(dr->d_name, "..")) {
            continue;
        }
        char *abs_path = malloc(strlen(path) + strlen(dr->d_name) + 2);
        if (!abs_path) {
            perror("malloc");
            exit(EXIT_FAILURE);
        }
        strcpy(abs_path, path);
        strcat(abs_path, "/");
        strcat(abs_path, dr->d_name);
        if (lstat(abs_path, &fs) < 0) {
            free(abs_path);
            continue;
        }
        if (S_ISDIR(fs.st_mode)) {
            readDir(abs_path);
        }
        printf("\t%s\n", dr->d_name);
        free(abs_path);
    }
}

int
main(int argc, char *argv[])
{
    if (argc != 2) {
        fprintf(stderr, "Usage: %s dir\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    readDir(argv[1]);

    exit(EXIT_SUCCESS);
}

答案 1 :(得分:0)

除了d_namestruct dirent也有一个名为d_type的成员。

然后为了完成你的任务,就这样做吧。像:

struct dirent * dirr;
DIR * directory = opendir(opt_basedir);

if (directory) {
    while ((dirr = readdir(directory)) != nullptr) {
        if (DT_DIR == dirr->d_type) {
            ...
        }
    }
    ...
}

...是您可能想要添加的任何代码。这里DT_DIR可以帮助您检查它是否是目录。您不需要使用stat()S_ISDIR等。 (因为您已经使用过dirent

希望这个答案可以帮助你和其他有类似问题的人。