Как распечатать каждый каталог, но как путь?(Объяснено в описании тела) - PullRequest
0 голосов
/ 08 октября 2018

Это код, написанный Ллойдом Макрохоном, и вся заслуга принадлежит ему, но последние два дня я пытался изменить этот код так, чтобы вместо отображения списка каждого элемента в каталоге я хотел его изменитьтак, что он показывает каждый элемент как длинный путь.

#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>

void listdir(const char *name, int indent)
{
    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 {
            printf("%*s- %s\n", indent, "", entry->d_name);
        }
    }
    closedir(dir);
}

int main(void) {
    listdir(".", 0);
    return 0;
}

Выше приведен оригинальный код, который при запуске в терминале Unix будет выводить что-то вроде:

-file
[directory]
    [directory]
        -file
    -file
    -file
    ....

Но вместо этого яя пытаюсь запустить его следующим образом:

file
directory/directory/file
directory/file
directory/file
...

В моей версии кода я уже удалил целые, и я заменил их на символ, который содержит символ, который должен быть именем пути дофайл.

#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>


void listdir(const char *name,const char *pname)
{
    DIR *dir;
    struct dirent *entry;
    char pathn = pname;

    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/", entry->d_name);
            pathn = pathn + entry->d_name;
            listdir(path,pathn);
        }
        else if( pathn != ""){
          printf("%s and  %s ", pathn, entry->d_name);
        }
        else {
            printf("%s\n", entry->d_name);
        }
    }
    closedir(dir);
}

int main(void) {
  listdir(".","");
    return 0;
}

ПРИМЕЧАНИЕ: Также прошу прощения за любые правила, которые я мог пропустить, я не знаю, если это незаконно или противоречит правилам изменять / загружать коды других пользователей без их разрешения, явсе еще довольно новый для этого.

1 Ответ

0 голосов
/ 08 октября 2018

Есть ли причина, по которой вы не печатаете name, переданный функции?

#define _GNU_SOURCE 1
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>

void listdir(const char *name, int indent)
{
    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 {
            printf("%s/%s\n", name, entry->d_name);
        }
    }
    closedir(dir);
}

int main() {
    system("mkdir -p dir/dir; touch dir/file dir/dir/file");
    listdir(".", 0);
    return 0;
}

Живой код доступен на onlinedbg .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...