C中的树命令:确切输出

时间:2018-05-18 20:11:23

标签: c

我会直接说到这一点,我知道这是一个已经问过的问题:

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时在第一级打印管道。

我真的不需要代码,因为我需要正确的想法才能使其正常工作:/

0 个答案:

没有答案