首页 > 解决方案 > 读取完整目录时的递归函数不会“进入目录”

问题描述

以下函数是用c编写的:

void store_files(char *pathname){
    printf("pathname = %s\n", pathname);
    char nextPath[PATH_MAX];
    DIR *dir;
    struct dirent *sd;
    struct stat stat_buffer;
    int fileNum = 0;
    int dirCount = 0;

    if((dir = opendir(pathname)) == NULL){
        printf("Cannot open directory!\n");
        exit(EXIT_FAILURE);
    }

    while((sd = readdir(dir)) != NULL){
        if(strcmp(sd->d_name, ".") == 0 || strcmp(sd->d_name, "..") == 0){
            continue;
        }

        if(stat(pathname, &stat_buffer) != 0){
            perror(pathname);
        }

        if(S_ISDIR(stat_buffer.st_mode)){
            //Defines archive number
            for(int i = 0; i < 100; i++){
                if(strcmp(tmpDirPathNames[i], pathname) == 0){
                    dirCount++;
                    break;
                }
            }

            //BUILD PATH
            sprintf(nextPath, "%s/%s", pathname, sd->d_name);

            store_files(nextPath);
        }

        else if(S_ISREG(stat_buffer.st_mode)){
            printf("filename = %s & filesize = %ld\n", sd->d_name, stat_buffer.st_size);
            time_t time = getFileModDate(pathname);
            archiveNum[dirCount - 1].fileData[fileNum].size = stat_buffer.st_size;
            archiveNum[dirCount - 1].fileData[fileNum].absolutePath = pathname;
            printf("modification date = %s ", ctime(&time));
            printf("fileNum = %i\n", fileNum);
            fileNum++;
        }
    }

    closedir(dir);
}

我认为没有必要解释 while 循环中的每个 if 语句的作用,因为它们与问题并不真正相关。但我会在这里更详细地解释我遇到的问题:

我的其他功能之一将通过我对压缩文件执行的提取过程创建一个包含大量 tmpdir.XXX 的 tmp 文件。

包含大量 tmpdir.XXX 的 tmp 文件示例

tmp
  ->tmpdir.XXX
      ->TestFolder1
      ->TestFolder2
  ->tmpdir.XXX
      ->TestFolder3
      ->TestFolder4

我的功能的建议是我想从 tmp 中的每个文件中提取信息。现在,该功能可以很好地进入第一个tmpdir.xxx并通过该文件夹中的所有文件夹,即TestFolder1 and TestFolder2. 但是,它不会进入第二个 tmpdir.XXX,因为会发生这种情况:(printf("pathname = %s\n", pathname);打印内容):

pathname = /mnt/c/Users/.../Desktop/.../.../.../Project2/tmp
pathname = /mnt/c/Users/.../Desktop/.../.../.../Project2/tmp/tmpdir.JlzQFY
pathname = /mnt/c/Users/.../Desktop/.../.../.../Project2/tmp/tmpdir.JlzQFY/Testfile1in2
pathname = /mnt/c/Users/.../Desktop/.../.../.../Project2/tmp/tmpdir.JlzQFY/Testfile2in2
pathname = /mnt/c/Users/.../Desktop/.../.../.../Project2/tmp/tmpdir.JlzQFY/tmpdir.QE1nk2

注意最后一个打印,它将下一个 tmpdir.XXX 添加到第一个打印上。我真的不明白这里发生了什么,我多年来一直盯着这个试图解决这个问题。

标签: c

解决方案


推荐阅读