我会直接说到这一点,我知道这是一个已经问过的问题:
Print a tree of file and subdirectories using only ASCII characters
OR
printing line like tree command
但我的问题实际上是关于命令的确切输出:" LC_ALL = C tree -n -charset = ascii [options] [dirs]"
我的程序看起来像这样,请原谅我编写的乱码:
#include <ctype.h>
#include <dirent.h>
#include <fnmatch.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
//Functions prototypes
void printaTree(int, char *, int *, int *, int);
void printTreeconPattern(int livello, char * pattern);
//MAIN
int main(int argc, char * argv[])
{
int checkgetopt;
char * pattern;
char * optargvalue;
int maxHeight;
int checkHidden = 0;
int indice;
int dirsindex = 0;
char ** directories;
directories = malloc(argc * sizeof(char *));
for (indice = optind; indice < argc; indice++) {
directories[dirsindex] = malloc(strlen(argv[indice]) * sizeof(char));
strcpy(directories[dirsindex], argv[indice]);
dirsindex++;
}
int livello = 0;
int i;
int countfiles = 0;
int countDirs = 0;
if (dirsindex == 0) {
printf("%s\n", ".");
printaTree(livello, ".", &countfiles, &countDirs, checkHidden);
} else {
for (i = 0; i < dirsindex; i++) {
printf("%s\n", directories[i]);
printaTree(livello, directories[i], &countfiles, &countDirs, checkHidden);
}
}
printf("\n%d directories, %d files\n", countDirs, countfiles);
free(directories);
return 0;
}
void printaTree(int livello, char * directory, int * filenum, int * dirnum, int hidden)
{
struct dirent ** dobjects;
int numeroOggetti = scandir(directory, &dobjects, NULL, alphasort);
if (numeroOggetti == -1) {
perror("scandir");
}
char pathnuovo[1024];
int i;
int checkSym = 0;
char * buf;
for (i = 0; i < numeroOggetti; i++) {
if ((strcmp(dobjects[i]->d_name, ".") == 0) || (strcmp(dobjects[i]->d_name, "..") == 0))
continue;
if (hidden == 0) {
if (dobjects[i]->d_name[0] == '.') {
continue;
}
}
//Print how Tree command would print:
if (i != numeroOggetti - 1) {
if (livello != 0) {
printf("%*s", livello * 4 - 1, "");
} else {
printf("%*s", livello, "");
}
printf("|-- ");
printf("%s\n", dobjects[i]->d_name);
}
}
else
{
if (livello != 0) {
printf("%*s", livello * 4 - 1, "");
} else {
printf("%*s", livello, "");
}
printf("`-- ");
printf("%s\n", dobjects[i]->d_name);
}
if (dobjects[i]->d_type == DT_REG) {
(*filenum)++;
}
if (dobjects[i]->d_type == DT_DIR) {
(*dirnum)++;
livello = livello + 1;
snprintf(pathnuovo, sizeof pathnuovo, "%s%s%s", directory, "/", dobjects[i]->d_name);
printaTree(livello, pathnuovo, filenum, dirnum, hidden);
livello = livello - 1;
}
}
所以我的代码实际上有效,我省略了我的代码处理输入选项和dir条目中符号链接检查的部分。
在如下结构的测试文件夹中:
RootDIRname
file1
file2
dir1
file4
dir2
file6
file7
dir3
file10
file11
file8
file9
我的代码输出:
RootDIRname
|-- file1
|-- file2
|-- dir1
|-- file4
|-- dir2
|-- file6
`-- file7
`-- dir3
|-- file10
`-- file11
|-- file8
`-- file9
确切的输出应该是:
RootDIRname
|-- file1
|-- file2
|-- dir1
| |-- file4
| |-- dir2
| | |-- file6
| | `-- file7
| `-- dir3
| |-- file10
| `-- file11
|-- file8
`-- file9
我在格式化方面尝试了很多方法,但我仍然缺少一些东西,如果我做了一个循环,我会得到一个类似的输出到正确的一个,但是会有额外的管道&#34; |&#34;对于每个级别,即使我不应该拥有它们(即&#34; dir3&#34;条目)。
我希望有人可以伸出援助之手。 先感谢您! 如果需要编辑代码或提供更多信息,请告诉我。
编辑:所以我的想法是,只有在以前的级别中仍有目录条目时才需要打印管道。但这意味着我必须通过递归调用来跟踪这些级别。 我怎样才能做到这一点? 我可以复制已经填充的Dirent结构,但是我不认为它会在实际级别为3时在第一级打印管道。
我真的不需要代码,因为我需要正确的想法才能使其正常工作:/