2009-07-04 3 views
2

Я знаю, что стандарт C не дает мне возможности делать что-либо с папками, но мне нужен довольно переносимый и межплатформенный способ доступа к папкам. В это время все, что мне нужно сделать, это создать папку, проверить, существует ли папка и, возможно, удалить папку. В ближайшем будущем мне может потребоваться прочитать файлы из папки, но это не очень настоятельная необходимость.Библиотеки C для доступа к каталогам

В любом случае, мне было интересно, есть ли хорошая кросс-платформенная библиотека C для работы с каталогами. В абсолютном значении я могу, вероятно, свернуть свой собственный, чтобы работать на POSIX и Windows, но мне было интересно, есть ли там какие-то хорошие. Я рассматриваю GLib или Apache Portable Runtime, но у обоих есть лот больше, чем мне действительно нужно, и я хотел бы сохранить это довольно легким. Я также рассмотрел использование внутренних компонентов популярного языка сценариев, таких как Perl или Python, но это также кажется большим количеством накладных расходов только для функций каталога.

Если у кого-то есть что добавить в этот список, который я должен изучить или хочу сделать хороший пример для одного из вариантов, которые я уже перечислял, скажите, пожалуйста. Я не хочу звучать так, как будто я прошу код, но если вы разместили простую функцию, например int direxist(char *dirname), которая вернула true, если каталог существует, а false - иначе, просто чтобы проиллюстрировать API для выбранной вами библиотеки, это было бы действительно удивительно, и я думаю, что не слишком сложно. Если вы хотите отстаивать использование POSIX/катите мою собственную, сделайте это тоже, потому что я присоска для изучения новых вещей, подобных этому, делая это сам.

Просто убедитесь, что я хочу C, а не C++. Я уверен, что повышение - это хорошо, но меня не интересуют решения на C++.

ответ

3

Я бы прыгнул на победителях APR. Это дает вам гораздо больше, чем доступ к каталогам, но это лучшая многоплатформенная библиотека C, которую я использовал. Скорее всего, в любом случае вы будете нуждаться в некоторых других компонентах в будущем, так что вы также можете им удобно.

Другой вариант - реализовать POSIX API, установленный поверх Win32, и просто написать все в POSIX. Бонус здесь заключается в том, что Windows быстро становится единственной современной ОС, которая не включает реализацию среды исполнения POSIX.

1

Я рассматривал GLib или Apache Portable Runtime, но оба они поставляются с гораздо большим количеством материалов, чем мне действительно нужно, и я хотел бы сохранить это довольно легким.

Весьма вероятно, что GLib уже установлен (по крайней мере, на GNU/Linux). Единственная проблема заключается в том, что она добавит зависимость.

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

Я предпочел бы использовать Python в первую очередь и, возможно, использовать C для определенных частей кода.

>>> def direxist(dirname): 
...  return os.path.isdir(dirname) 
... 
>>> direxist('/') 
True 
>>> direxist('/home') 
True 
>>> direxist('/home/bastien/Petites leçons de typographie.pdf') 
False 

О написании собственной функции C, он бы что-то вроде этого:

#include <stdio.h> 

#ifdef _WIN32 
#include <windows.h> 
#else 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#endif 

int direxist(const char* dirname) 
{ 
#ifdef _WIN32 
    /* ... */ 
#else 
    struct stat fileinfo; 
    int ret = -1; 

    if (stat(dirname, &fileinfo) == -1) 
    { 
     perror("direxist"); 
    } 
    else 
    { 
     if (S_ISDIR(fileinfo.st_mode)) 
     { 
      ret = 1; 
     } 
     else 
     { 
      ret = 0; 
     } 
    } 

    return ret; 
#endif 
} 

int 
main (void) 
{ 
    printf("%d\n", direxist("/")); 

    return 0; 
} 

я не как сделать это с Win32, так что вы будете найти его самостоятельно.

Однако я настоятельно рекомендую использовать внешнюю библиотеку.Вы не заходите далеко не только в библиотеку C, но и заново изобретаете колесо.

+0

Я нахожусь в OS X, поэтому для меня нет бесплатного GLib. Я иногда чувствую, что OS X - рыжеволосый stepchild переносимости ОС - несмотря на то, что он довольно близок к POSIX, никто не очень много думает об этом. Я не хочу использовать Python, потому что я не знаю Python (пока), и я бы предпочел написать его в C (личное предпочтение). Я не против добавления зависимости, но сначала хотел бы узнать мои варианты. –

+0

@Chris: если GTK + работает на OS X, я уверен, что GLib работает. Я предполагаю, что этот пакет содержит GLib: http://www.gtk-osx.org/. –

+0

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

0

Я думаю, вы должны использовать APR или что-то в том же духе. Проектирование POSIX API, а затем его реализация для окон не очень хорошо работает в моем опыте (который довольно ограничен, я должен признаться).

Файл IO и родственная семантика слишком разные, поэтому вам нужно самостоятельно разработать свой API для работы с окнами. Существуют также различные ограничения на то, что может быть включено в открытый API. Одним из примеров такой проблемы является API-интерфейс python C для обработки файлов. Он был четко разработан с POSIX POV, и его очень сложно использовать в окнах из-за таких вещей, как совместное использование объектов времени выполнения C и т. Д.