Как получить список каталогов в C?

c file folder

109488 просмотра

10 ответа

12893 Репутация автора

Как сканировать каталог для папок и файлов в C? Он должен быть кросс-платформенным.

Автор: andrewrk Источник Размещён: 15.08.2008 05:15

Ответы (10)


5 плюса

3641 Репутация автора

opendir / readdir - POSIX. Если POSIX недостаточно для переносимости, которую вы хотите достичь, проверьте Apache Portable Runtime

Автор: PW. Размещён: 15.08.2008 05:26

71 плюса

3512 Репутация автора

Следующая программа 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:27

18 плюса

33680 Репутация автора

Строгий ответ «вы не можете», поскольку сама концепция папки не является действительно кросс-платформенной.

На платформах MS вы можете использовать _findfirst, _findnext и _findclose для типа «c», а FindFirstFile и FindNextFile для базовых вызовов Win32.

Вот ответ C-FAQ:

http://c-faq.com/osdep/readdir.html

Автор: Will Dean Размещён: 15.08.2008 05:27

9 плюса

49924 Репутация автора

Не существует стандартного способа C (или C ++) для перечисления файлов в каталоге.

В Windows вы можете использовать функции FindFirstFile / FindNextFile для перечисления всех записей в каталоге. В Linux / OSX используются функции opendir / readdir / closedir.

Автор: Andrew Grant Размещён: 15.08.2008 05:29

2 плюса

3117 Репутация автора

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

Решением этой проблемы будет поиск библиотеки, которая маскирует эту проблему и переносит ее. К сожалению, нет решения, которое безупречно работает на всех платформах.

В совместимых с POSIX системах вы можете использовать библиотеку для достижения этой цели, используя код, опубликованный Clayton (на который ссылаются первоначально из Advanced Programming в книге UNIX У. Ричарда Стивенса). это решение будет работать в системах * NIX, а также будет работать в Windows, если у вас установлен Cygwin.

Кроме того, вы можете написать код для обнаружения базовой ОС, а затем вызвать соответствующую функцию списка каталогов, которая будет содержать «правильный» способ указать структуру каталогов в этой ОС.

Автор: Pascal Размещён: 15.08.2008 08:20

7 плюса

24891 Репутация автора

GLib - это портативная / полезная библиотека для C, которая составляет основу графического инструментария GTK +. Он может использоваться как отдельная библиотека.

Он содержит переносные оболочки для управления каталогами. Дополнительную информацию см. В документации по файлам Glib File .

Лично я бы даже не подумал написать большое количество C-кода без чего-то вроде GLib позади меня. Переносимость - это одно, но также приятно получать структуры данных, помощники потоков, события, mainloops и т. Д. Бесплатно

Jikes, я почти начинаю звучать как продавец по продажам :) (не волнуйтесь, glib - с открытым исходным кодом (LGPL), и я никак не связан с ним)

Автор: Isak Savo Размещён: 17.09.2008 08:18

1 плюс

125610 Репутация автора

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

Автор: Mehrdad Размещён: 24.07.2011 07:42

13 плюса

6907 Репутация автора

Я создал заголовок с открытым исходным кодом (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

0 плюса

11 Репутация автора

Вы можете найти пример кода на ссылке 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 плюса

1288 Репутация автора

Поздно, но думаю, я не могу себя держать ...

Используя 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
Вопросы из категории :
32x32