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

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

15.08.2008 17:15:04
9 ОТВЕТОВ

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

5
5.02.2009 06:17:48

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

76
5.11.2018 11:27:17
Как насчет этого:error: unknown type name 'off64_t'
Tomáš Zato - Reinstate Monica 13.05.2014 11:12:39
Я должен был изменить whileусловие на(ep = readdir(dp)) != NULL)
gwg 8.01.2015 04:59:16
@Clayton - что если я хочу напечатать только файлы .txt?
jimo 13.05.2015 13:17:03
Для Windows вам может понадобиться win32-реализация dirent.h: github.com/tronkko/dirent . Просто измените <dirent.h> на "dirent.h"
bot1131357 11.12.2016 23:20:47

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

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

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

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

19
5.02.2009 06:17:11
уже есть псевдоним для _findfirst, _findnext и _findclose где-нибудь? не в windows.h не так ли?
BuddyJoe 14.08.2012 13:12:37

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

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

9
15.08.2008 17:29:29
Повышение также не C.
Chris Lutz 4.07.2009 22:58:24

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

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

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

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

2
15.08.2008 20:20:24

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

Он содержит переносимые обертки для управления каталогами. Подробности смотрите в документации по Glib File Utilities .

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

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

7
17.09.2008 20:18:26

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

1
24.07.2011 07:42:21

Я создал открытый заголовок (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);
17
4.02.2013 00:52:29
Как это может помочь больше, чем оригинальная системно-зависимая реализация? Или вам нужна только одна именованная библиотека для Windows и POSIX?
kevr 8.11.2016 01:40:31
@kevr: tinydir.h - гигантское #ifdefрешение в одном удобном заголовочном файле.
Joshua 23.05.2019 01:42:05

Вы можете найти образец кода по ссылке викибукса

/**************************************************************
 * 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;
}
0
28.11.2017 19:21:44