【问题标题】:How to list all projects on computer (C, Java, Python, C++, etc...)如何列出计算机上的所有项目(C、Java、Python、C++ 等...)
【发布时间】:2020-09-19 06:26:27
【问题描述】:

我想编写一个程序来列出我硬盘上的所有项目,无论是哪种语言。例如,如果我有类似user/projects/C/decompressor/src/... 的东西,我希望程序输出decompressor,这是项目根目录,因为它包含src 文件夹等等。但是src的父文件夹不是真正的根文件夹的情况太多了: projects/C/my-app/release1/src/...projects/C/another-project-in-c/master/src/...

所以在编码之前,我想知道最好的方法是什么?我有一段代码不能按我的意愿工作:

    DIR *dir;
    struct dirent *entry;

    if (!(dir = opendir(name)))
      return;

    while ((entry = readdir(dir)) != NULL) {
      if (entry->d_type == DT_DIR) {
          char path[1024];
          if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
              continue;
          snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
          //printf("%*s[%s]\n", indent, "", entry->d_name);
          listdir(path, indent + 2);
      } else {
        if (strcmp(get_file_extension(entry->d_name), ".c") == 0) {
          char buffer[1024];
          realpath(name, buffer);

          printf("possible root folder = \"%s\" \n", get_parent(buffer)); 
        }
      }
    }
    closedir(dir);

和:

char* get_parent(char* filename) {
    return (dirname(filename));
}

const char* get_file_extension(const char* filename) {
    assert(filename != NULL);

    char buffer[1024];
    char* tmp = strcpy(buffer, filename);
    char *ext = strrchr(tmp, '.');

    if (ext == NULL)
        return (char*) tmp + strlen(tmp);

    for (char *iter = ext + 1; *iter != '\0'; iter++) {
        if (!isalnum((unsigned char)*iter))
            return (char*) tmp + strlen(tmp);
    }

    return ext;
}

我没提,不过还有java项目结构(projects/JAVA/MyApp/com/lorem/ipsum/concrete-package)要算。

在所有特殊情况下这是否可能?

【问题讨论】:

    标签: c file dirent.h


    【解决方案1】:

    projects 成为整个项目的根,那么你首先要使用readdir 循环扫描projects 中的所有目录(假设projects 中的每个目录都代表某种语言并包含实际项目目录)。 迭代时,您希望扫描每个语言文件夹本身以查找包含的所有 d_names。

    为了澄清我在说什么,我为你准备了一些伪代码:

    dirp = opendir("/user/projects");
    while (entp = readdir(dirp)) {
        inner_dirp = opendir(entp->d_name);
        while (inner_entp = readdir(inner_dirp)) {
            print(inner_entp->d_name)
        }
    }
    

    请注意,如果您的文件夹结构容易发生变化,您可能需要采用递归方法。

    【讨论】:

      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 2012-06-08
      • 2010-10-25
      • 1970-01-01
      • 2015-03-29
      • 2012-05-24
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多