Как получить список каталогов в C?
109488 просмотра
10 ответа
Как сканировать каталог для папок и файлов в C? Он должен быть кросс-платформенным.
Автор: andrewrk Источник Размещён: 17.05.2019 03:55Ответы (10)
71 плюса
Следующая программа POSIX будет печатать имена файлов в текущем каталоге:
#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main (void)
{
DIR *dp;
struct dirent *ep;
dp = opendir ("./");
if (dp != NULL)
{
while (ep = readdir (dp))
puts (ep->d_name);
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
return 0;
}
Кредит: http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html
Протестировано в Ubuntu 16.04.
Автор: Clayton Размещён: 15.08.2008 05:2718 плюса
Строгий ответ «вы не можете», поскольку сама концепция папки не является действительно кросс-платформенной.
На платформах MS вы можете использовать _findfirst, _findnext и _findclose для типа «c», а FindFirstFile и FindNextFile для базовых вызовов Win32.
Вот ответ C-FAQ:
http://c-faq.com/osdep/readdir.html
Автор: Will Dean Размещён: 15.08.2008 05:2713 плюса
Я создал заголовок с открытым исходным кодом (BSD) C, который занимается этой проблемой. В настоящее время он поддерживает POSIX и Windows. Пожалуйста, проверьте это:
https://github.com/cxong/tinydir
tinydir_dir dir;
tinydir_open(&dir, "/path/to/dir");
while (dir.has_next)
{
tinydir_file file;
tinydir_readfile(&dir, &file);
printf("%s", file.name);
if (file.is_dir)
{
printf("/");
}
printf("\n");
tinydir_next(&dir);
}
tinydir_close(&dir);
Автор: congusbongus
Размещён: 04.02.2013 12:52
9 плюса
Не существует стандартного способа C (или C ++) для перечисления файлов в каталоге.
В Windows вы можете использовать функции FindFirstFile / FindNextFile для перечисления всех записей в каталоге. В Linux / OSX используются функции opendir / readdir / closedir.
Автор: Andrew Grant Размещён: 15.08.2008 05:297 плюса
GLib - это портативная / полезная библиотека для C, которая составляет основу графического инструментария GTK +. Он может использоваться как отдельная библиотека.
Он содержит переносные оболочки для управления каталогами. Дополнительную информацию см. В документации по файлам Glib File .
Лично я бы даже не подумал написать большое количество C-кода без чего-то вроде GLib позади меня. Переносимость - это одно, но также приятно получать структуры данных, помощники потоков, события, mainloops и т. Д. Бесплатно
Jikes, я почти начинаю звучать как продавец по продажам :) (не волнуйтесь, glib - с открытым исходным кодом (LGPL), и я никак не связан с ним)
Автор: Isak Savo Размещён: 17.09.2008 08:185 плюса
opendir / readdir - POSIX. Если POSIX недостаточно для переносимости, которую вы хотите достичь, проверьте Apache Portable Runtime
Автор: PW. Размещён: 15.08.2008 05:262 плюса
Список каталогов сильно варьируется в зависимости от рассматриваемой ОС / платформы. Это связано с тем, что для достижения этой цели различные операционные системы используют собственные внутренние системные вызовы.
Решением этой проблемы будет поиск библиотеки, которая маскирует эту проблему и переносит ее. К сожалению, нет решения, которое безупречно работает на всех платформах.
В совместимых с POSIX системах вы можете использовать библиотеку для достижения этой цели, используя код, опубликованный Clayton (на который ссылаются первоначально из Advanced Programming в книге UNIX У. Ричарда Стивенса). это решение будет работать в системах * NIX, а также будет работать в Windows, если у вас установлен Cygwin.
Кроме того, вы можете написать код для обнаружения базовой ОС, а затем вызвать соответствующую функцию списка каталогов, которая будет содержать «правильный» способ указать структуру каталогов в этой ОС.
Автор: Pascal Размещён: 15.08.2008 08:201 плюс
Наиболее похожий метод, readdir
вероятно, использует малоизвестное _find
семейство функций .
0 плюса
Вы можете найти пример кода на ссылке wikibooks
/**************************************************************
* A simpler and shorter implementation of ls(1)
* ls(1) is very similar to the DIR command on DOS and Windows.
**************************************************************/
#include <stdio.h>
#include <dirent.h>
int listdir(const char *path)
{
struct dirent *entry;
DIR *dp;
dp = opendir(path);
if (dp == NULL)
{
perror("opendir");
return -1;
}
while((entry = readdir(dp)))
puts(entry->d_name);
closedir(dp);
return 0;
}
int main(int argc, char **argv) {
int counter = 1;
if (argc == 1)
listdir(".");
while (++counter <= argc) {
printf("\nListing %s...\n", argv[counter-1]);
listdir(argv[counter-1]);
}
return 0;
}
Автор: David Wu
Размещён: 28.11.2017 07:21
0 плюса
Поздно, но думаю, я не могу себя держать ...
Используя C, int system(char*)
вы можете делать всевозможные вещи через «портативный» C-интерфейс. Вам нужно будет загрузить приложение на язык системы (например, Shell / Bash, DOS, PowerShell), но по крайней мере вам не потребуется связывать дополнительные библиотеки. И, в отличие от этого dirent
, вы можете использовать всевозможные «независимые от платформы» вещи, используя его.
Пример списка каталогов с linux (в основном псевдо):
system("ls . > some_file_or_pipe_or_whatever") //
fscanf(file_or_pipe_or_whatever, "%s", a_line_from_ls);
Автор: Andreas
Размещён: 25.06.2018 12:01
Вопросы из категории :
- c Как вы форматируете unsigned long long int, используя printf?
- c What are the barriers to understanding pointers and what can be done to overcome them?
- c Как реализовать продолжения?
- c Как вы передаете функцию в качестве параметра в C?
- c Как получить список каталогов в C?
- c В чем разница между #include <filename> и #include "filename"?
- file Динамически загружать файл JavaScript
- file Find number of files with a specific extension, in all subdirectories
- file Поиск и замена строки в файле в Python
- file Как я могу получить путь и имя файла, который выполняется в настоящее время?
- file Как проверить, является ли данная строка допустимым / допустимым именем файла в Windows?
- folder Как переименовать папку проекта из Visual Studio?
- folder Получение пути к временной папке пользователя в Windows
- folder Как я могу вычислить контрольную сумму md5 в каталоге?
- folder Создайте папку внутри папки документов в приложениях iOS
- folder Как прочитать все файлы в папке с Java?