【问题标题】:c: return all the filenames in directoryc: 返回目录中的所有文件名
【发布时间】:2011-12-17 04:42:23
【问题描述】:

如何编写一个函数来返回一个目录中的所有文件名,包括子目录中的文件。 到目前为止,我有这样的东西,但它不能正常工作,我尝试调用这个函数并打印出每个元素,它只打印第一个元素。

谁能告诉我我做错了什么或编写此函数的其他方法?

char **allFiles(char *dir, OPTIONS opts) {
        char **allfiles = malloc(sizeof(char **));
        struct dirent *dp;

        while((dp = readdir(dirp)) != NULL) {

            if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
                continue;
            if (dp->d_type == DT_DIR)
                allfiles = allFiles(strcat(strcat(dir, "/"), dp->d_name));

            if (dp->d_type != DT_DIR)
                *allfiles = strdup(strcat(strcat(strdup(dir), "/"), dp->d_name));

            ++allfiles;
        }
    closedir(dirp);
    return allfiles;
}

【问题讨论】:

  • 又是标准问题——“不能正常工作”是什么意思?
  • 也许使用 ftw() 或 nftw() 调用更容易完成这项任务。

标签: c file


【解决方案1】:

allfiles[] 数组由父级和递归子级填充。子插入其中,但结果被父覆盖。

更新:重读后,我看到阵列管理看起来不错(除了可能超出它的结尾) 也许你的文件描述符用完了?

UPDATE2:替换

if (dp->d_type != DT_DIR)
        *allfiles = strdup(strcat(strcat(strdup(dir), "/"), dp->d_name));
        ++allfiles;

作者:

if (dp->d_type != DT_DIR)
        *allfiles++ = strdup(strcat(strcat(strdup(dir), "/"), dp->d_name));

【讨论】:

  • 我看错了。我希望将 alfiles[] 数组传递给递归 all。片段中有不止一个错误...
  • 见米歇尔的反应。您的数组只有一个元素。您可以增加指针,但它会指向您的数组之外。另外:递归调用的返回会覆盖父级的指针,并使父级的 1 元素数组不可访问。
  • 我会说重新分配所有文件看起来更加令人反感。
  • 一个元素是因为您的指针在返回时指向数组的末尾。
  • 片段错误太多,无法全面分析。我什至没见过“strdup(strcat(strcat(strdup(dir), "/"), dp->d_name));”怪物,虽然我默默地复制粘贴它。叹气,咖啡。
【解决方案2】:

无法增加allfiles 指针,因为您只分配空间来容纳1 个指针(指向char *)。另一个问题是allfiles 在找到目录时会被覆盖(从而丢失之前找到的所有文件和目录)。

【讨论】:

    【解决方案3】:

    如果您的平台有glob(),您是否考虑过使用它?

    【讨论】:

    • 如果使用 glob(),如何将当前目录更改为子目录?
    • 糟糕,我实际上并没有阅读您的代码,因此没有注意到您想要递归到子目录。那里的问题是您重新分配和增加所有文件,这不会产生合理的结果。
    • 这里也一样。要点是:代码与实际可行的代码非常相似,尽管它在不止一个地方存在严重错误。
    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2021-05-14
    • 2022-11-30
    • 2023-01-04
    • 2014-05-16
    • 1970-01-01
    相关资源
    最近更新 更多