каталог root в любой операционной системе - PullRequest
0 голосов
/ 04 апреля 2020

Есть ли способ получить указатель DIR на каталог root, независимо от операционной системы? желательно без проверки макросов, например #ifdef _WIN32 #endif (etc..), поэтому, например, в windows будет возвращен указатель на папку C/.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Есть ли способ получить указатель DIR на каталог root, независимо от операционной системы? желательно без проверки макросов, например #ifdef _WIN32 #endif (etc..), поэтому, например, в windows будет возвращен указатель на папку C/.

Вопрос предполагает, что существует универсальная концепция единой файловой системы. root для начала. Это не вариант. В частности, Windows - это многокорневая файловая система, каждая буква диска имеет отдельный root и, более того, без абсолютного смысла основного диска (системные файлы Windows не обязательно находятся на C: диск). Фактически, операционные системы, которые поддерживают язык C, вообще не должны иметь иерархические файловые системы.

В целом, интерпретация строк имени файла передается fopen(), opendir(), & co. зависит от реализации, так что нет, язык не предоставляет универсального способа получить DIR * в файловую систему root, даже в системах, где эта концепция имеет смысл в первую очередь. И это хороший повод пересмотреть вопрос о том, почему вы думаете, что хотите такую ​​вещь - все, что, по вашему мнению, вы бы с ней сделали, вероятно, не так широко, как вы думаете.

1 голос
/ 04 апреля 2020

Я не использую Windows, поэтому я не уверен, что этот ответ может быть таким простым, как opendir("/"), или следующий код будет правильно работать на Windows. Однако, предполагая, что /.. работает на Windows, а C:/.. возвращает NULL, следующее должно напечатать все элементы в каталоге root.

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

DIR* _get_root(void) {
    DIR     *d = NULL, *prev = NULL;
    char    *path = malloc(strlen(".") + 1);
    char    *pdir = "/..";

    strcpy(path, ".");

    do {
        if (prev) {
            closedir(prev);
        }
        prev = d;

        path = realloc(path, strlen(path) + strlen(pdir) + 1);
        strcat(path, pdir);

        d = opendir(path);
    } while (d);

    free(path);
    return prev;
}

int main(int argc, char **argv) {
    DIR             *root = _get_root();
    struct dirent   *sub;

    while ((sub = readdir(root))) {
        printf("%s\n", sub->d_name);
    }

    closedir(root);
    return 0;
}

Конечно, прежде чем использовать это предложение, попробуйте просто

DIR *root = opendir("/");

на Windows и посмотрите, работает ли оно.

...