【发布时间】: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)要算。
在所有特殊情况下这是否可能?
【问题讨论】: