2009-07-04 3 views
2

Ich weiß, dass Standard C mir keine Möglichkeit gibt, etwas mit Ordnern zu tun, aber ich möchte eine ziemlich portable und plattformübergreifende Möglichkeit haben, auf Ordner zuzugreifen. Zu diesem Zeitpunkt muss ich lediglich einen Ordner erstellen, prüfen, ob ein Ordner vorhanden ist, und möglicherweise einen Ordner löschen. Ich kann vorhersehen, dass ich in naher Zukunft Dateien aus einem Ordner lesen muss, aber das ist kein sehr dringendes Bedürfnis.C-Bibliotheken für den Verzeichniszugriff

Wie auch immer, ich fragte mich, ob es eine gute plattformübergreifende C-Bibliothek für die Arbeit mit Verzeichnissen gab. In einer absoluten Prise kann ich wahrscheinlich meine eigenen rollen, um an POSIX und Windows zu arbeiten, aber ich habe mich gefragt, ob es da draußen schon gute gibt. Ich habe über GLib oder die Apache Portable Runtime nachgedacht, aber beide kommen mit einem Los mehr Zeug als ich wirklich brauche, und ich möchte dieses ziemlich leicht behalten. Ich habe auch überlegt, die Interna einer populären Skriptsprache, wie Perl oder Python, zu verwenden, aber das scheint mir auch nur eine Menge Aufwand für Verzeichnisfunktionen zu sein.

Wenn irgendjemand etwas zu dieser Liste hinzufügen muss, auf das ich schauen sollte, oder möchte ich eine gute Sache für eine der Optionen machen, die ich bereits aufgelistet habe, bitte sag es mir. Ich möchte nicht so klingen, als würde ich nach Code fragen, aber wenn Sie eine einfache Funktion wie int direxist(char *dirname) gepostet haben, die true zurückgegeben hat, wenn das Verzeichnis existiert und false, nur um die API für Ihre Bibliothek der Wahl zu veranschaulichen, wäre das wirklich fantastisch, und ich stelle mir nicht allzu schwer vor. Wenn Sie sich für die Verwendung von POSIX einsetzen möchten, dann tun Sie das auch, weil ich ein Anfänger bin, um so etwas zu lernen, indem ich es selbst mache.

Nur um sicher zu gehen, ich will C, nicht C++. Ich bin sicher Boost ist gut, aber ich bin nicht an C++ - Lösungen interessiert.

Antwort

3

Ich würde auf den APR-Zug aufspringen. Es bietet Ihnen viel mehr als nur Verzeichniszugriff, aber es ist die beste Multi-Plattform-C-Bibliothek, die ich verwendet habe. Die Chancen stehen gut, dass Sie in Zukunft sowieso einige der anderen Komponenten benötigen werden, also sollten Sie sie genauso zur Hand haben.

Die andere Möglichkeit besteht darin, den POSIX-API-Satz über Win32 zu implementieren und einfach alles in POSIX zu schreiben. Der Vorteil hierbei ist, dass Windows schnell zum einzigen modernen Betriebssystem wird, das keine POSIX-Laufzeit-Implementierung enthält.

1

Ich habe über GLib oder die Apache Portable Runtime nachgedacht, aber beide kommen mit viel mehr Sachen, als ich wirklich brauche, und ich möchte das ziemlich leicht behalten.

Es ist ziemlich wahrscheinlich, dass GLib bereits installiert ist (zumindest unter GNU/Linux). Das einzige Problem ist, dass es eine Abhängigkeit hinzufügen wird.

Ich habe auch überlegt, die Interna einer populären Skriptsprache, wie Perl oder Python, zu verwenden, aber das scheint auch eine Menge Overhead nur für Verzeichnisfunktionen zu sein.

Ich würde lieber Python in erster Linie verwenden und möglicherweise C für bestimmte Teile des Codes verwenden.

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

Über Ihre eigene C-Funktion zu schreiben, wäre es etwas so gehen:

#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; 
} 

ich nicht, wie es mit Win32 zu tun, so dass Sie, dass sich selbst zu finden.

Ich würde jedoch dringend empfehlen, eine externe Bibliothek zu verwenden.Sie gehen nicht weit mit der C-Bibliothek oder indem Sie das Rad neu erfinden.

+0

Ich bin auf OS X, so dass keine für mich frei GLib. Ich habe manchmal das Gefühl, dass OS X das rothaarige Stiefkind von OS Portabilität ist - trotz POSIX ziemlich nahe zu sein, wirklich niemand denkt viel darüber. Ich möchte Python nicht benutzen, weil ich Python (noch) nicht kenne und ich würde es lieber in C schreiben (persönliche Präferenz). Es macht mir nichts aus, eine Abhängigkeit hinzuzufügen, aber ich möchte zuerst meine Optionen kennen. –

+0

@ Chris: Wenn GTK + Arbeiten auf OS X ist, ich bin mir ziemlich sicher, dass GLib wie gut funktioniert. Meine Vermutung ist, dass dieses Paket GLib enthält: http://www.gtk-osx.org/. –

+0

Ich habe - das Paket enthält GTK + und GLib, aber es installiert unter Xcode Ordnern und ich in der Regel über die Kommandozeile arbeiten, so ist es ein bisschen umständlich. Ich werde sehen, was ich tun kann. –

0

Ich glaube, Sie April oder etwas in diesem Sinne verwendet werden sollen. Eine POSIX-API zu entwickeln und sie dann für Windows zu implementieren, funktioniert meiner Erfahrung nach nicht gut (was ich ziemlich bekennen muss).

Datei-IO und die damit verbundene Semantik ist einfach zu verschieden, so müssen Sie Ihre API-Design mit Fenstern sofort zu behandeln. Es gibt auch verschiedene Einschränkungen, was in die öffentliche API eingefügt werden kann. Ein Beispiel für ein solches Problem ist die Python-C-API für die Dateiverarbeitung. Es wurde eindeutig mit einem POSIX POV entworfen, und es ist sehr schwierig, es auf windows wie wegen der Dinge zu verwenden C-Objekte teilen Laufzeiten, etc ...