Как получить полный локальный путь к файлам в каталоге?

Я хочу прочитать все файлы в данном каталоге. Я использую систему Linux и использую dirent.h. Мне интересно, есть ли более изящный способ получить полный локальный путь к каждому файлу, чем добавление его вручную?

ReadFile(char *path) {
     FILE *file = fopen(path, "r");
     //do stuff
}

DIR *dir;
if ((dir = opendir ("./dir/dir/")) != NULL) {
     struct dirent *d;
     while ((d = readdir (dir)) != NULL) {
          char string[1024];
          strcpy(string, "./dir/dir/");
          strcat(string,d->d_name);
          ReadFile(string);
     }
 }
 closedir (dir);
}
3 симпатии

Давайте немного разберемся.

Есть два типа путей: относительные и абсолютные.

Абсолютные пути всегда начинаются с root: / или что-то вроде домашнего каталога пользователя: ~(это просто ярлык, содержащий корень)

Относительные пути всегда относительно местоположения, например путь относительно рабочего каталога. Когда вы запускаете свою программу из командной строки, независимо от того, в какой папке на вашем терминале есть «cd 'd'», это ваш рабочий каталог.

Если это не так, похоже, что вы ищете относительный путь файла к вашему рабочему каталогу. Это правильно?

Если это так - вы делаете это правильно … но если вам нужен более элегантный подход, вы можете «построить» относительный путь всего в одной строке кода, используя sprintf вместо strcpy и, strcat т.е.

#define BUFSIZE 1024
char path[BUFSIZE];
char *dir = "./foo/bar";
char *filename = "readme.txt"
sprintf(path, "%s/%s", dir, filename);
printf("%s", path); // prints "./foo/bar/readme.txt"

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

2 симпатии