Сведения о вопросе

Henry

07:23, 12th August, 2020

Теги

c   file   directory   common-tasks    

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

Просмотров: 641   Ответов: 10

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



  Сведения об ответе

lourence

04:20, 13th August, 2020

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


  Сведения об ответе

DAAA

16:07, 4th August, 2020

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

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

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

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


  Сведения об ответе

SEEYOU

10:41, 10th August, 2020

Я создал заголовок open source (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);


  Сведения об ответе

VCe znayu

07:09, 7th August, 2020

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

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


  Сведения об ответе

qwerty101

20:30, 3rd August, 2020

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

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

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

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


  Сведения об ответе

prince

22:14, 26th August, 2020

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


  Сведения об ответе

SSESION

17:16, 2nd August, 2020

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

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

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

Кроме того, вы можете написать код для обнаружения базового OS и затем вызвать соответствующую функцию перечисления каталогов, которая будет содержать 'proper' способ перечисления структуры каталогов под этим OS.


  Сведения об ответе

PAGE

06:13, 18th August, 2020

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


  Сведения об ответе

ASER

12:24, 3rd August, 2020

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


  Сведения об ответе

DO__IT

00:55, 5th August, 2020

Уже поздно, но, наверное, я не могу сдержаться...

Используя C int system(char*) , вы можете делать все виды вещей через "portable" C-интерфейс. Вам нужно будет загрузить приложение на системном языке (например, Shell/Bash, DOS, PowerShell), но, по крайней мере, вам не нужно будет связывать дополнительные библиотеки. AND, в отличие от dirent , вы можете делать все виды "platform independent" вещей, используя его.

Пример листинга каталогов с linux (в основном псевдо):

system("ls . > some_file_or_pipe_or_whatever") //
fscanf(file_or_pipe_or_whatever, "%s", a_line_from_ls);


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться