2010-10-26 42 views
8

Ich muss ein Programm machen, wo ich die Dateien in einem angegebenen Verzeichnis indizieren muss. Ich habe den Indizierungsteil heruntergefahren, aber mit dem ich Probleme habe, ist, wie man zu dem Verzeichnis navigiert. Zum Beispiel sagen, wenn ich das Programm starte, wird es fragen: "Welches Verzeichnis möchten Sie indizieren?" Und dann wäre die Eingabe "usr/Documents/CS/Assignment4", wie komme ich zum "Assignment4" -Verzeichnis ? Ich weiß, Rekursion ist erforderlich, aber ich bin wirklich verwirrt, wie Verzeichnisse in C funktionieren. Sagen wir, meine Quelldatei befindet sich in "usr/Documents/SourceCode". Was soll ich tun, um zu Assignment4 zu kommen?In C, wie komme ich an ein bestimmtes Verzeichnis?

Ich weiß, ich klang wie ich will alle Antworten, aber ich bin völlig verloren, wie Verzeichnisse funktionieren, und das Buch, das ich habe saugt. Selbst wenn du nur einen Link zu einem guten Tutorial hast, wäre das fantastisch.

Ich benutze Linux, Ubuntu um genau zu sein. GCC ist der Compiler.

+0

Eine einfache Lösung könnte sein, das Programm in dem Verzeichnis auszuführen, das Sie indizieren möchten. Klingt, als würdest du das System-Dienstprogramm "ls -e" schreiben:) – Marm0t

Antwort

7

Die C-Programmiersprache hat keine Ahnung von einem Dateisystem. Dies ist stattdessen eine betriebssystemspezifische Frage.

Basierend auf dem Stil des Verzeichnisses in Ihrer Frage, obwohl es klingt wie Sie auf einem Unix/Linux-Stil-System sind. Wenn das der Fall ist, dann sind Sie für die opendir Funktion suchen

0

Der Name des Verzeichnisses ist nur ein String.

So opendir ("Dateiname"); wird es ermöglichen, das Verzeichnis "file" zu lesen.

Allerdings sollten Sie vielleicht in Dateinamen und Pfaden denken.

"usr/Documents/SourceCode" + "/../CS/Assignment4" ist das gleiche wie "usr/Documents/CS/Assignment4", aber ich nehme an, dass Sie das führende "/" vermissen.

Nun, ich verstehe nicht, wie Sie verloren gehen können, wie Verzeichnisse funktionieren. Ein Verzeichnis ist nichts anderes als ein "Ordner" in Windows oder Mac OS X. Unterste Zeile hat eine Festplatte ein Dateisystem und ein Dateisystem besteht nur aus Ordnern/Verzeichnissen, die Dateien enthalten (und spezielle Dateien wie benannte Sockets usw.) , das sollte dich jetzt nicht interessieren).

Hoffe das half zumindest ein bisschen.

Angelo

+0

Es tut mir leid, ich habe das falsch formuliert. nicht verloren, wie Verzeichnisse funktionieren, nur wie man mit ihnen in C arbeitet. Wie zB Verzeichnisse durchlaufen usw. – sx2000

1

Recursively ein Verzeichnis in C durchqueren geht so etwas:

Verwenden opendir und readdir die Verzeichniseinträge aufzulisten. Ich sollte wahrscheinlich das nicht tun, aber ich bin eine vollständige Codebeispiel (ohne Fehlerbehandlung) veröffentlichen, weil es ein paar kleine Dinge, die Sie tun müssen, um sicherzustellen, dass Sie die API korrekt verwenden:

DIR   *dir; 
struct dirent *de; 
const char *name; 

dir = opendir(dirpath); 
if (dir == NULL) { 
    /* handle error */ 
} 

for (;;) { 
    errno = 0; 
    de = readdir(dir); 
    if (de == NULL) { 
     if (errno != 0) { 
      /* handle error */ 
     } else { 
      /* no more entries left */ 
      break; 
     } 
    } 

    /* name of file (prefix it with dirpath to get a usable file path) */ 
    name = de->d_name; 

    /* ignore . and .. */ 
    if (name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) 
     continue; 

    /* do something with the file */ 
} 

if (closedir(dir) != 0) { 
    /* handle error */ 
} 

Wenn Sie mit jeder Datei arbeiten, stellen Sie sicher, dass der Pfad dorthin vorangestellt wird (ggf. mit einem Schrägstrich). Sie könnten auch chdir verwenden, um abzusteigen und aufzusteigen, aber es bringt Komplikationen in der Praxis mit sich (z. B. können Sie nicht zwei Verzeichnisse gleichzeitig durchlaufen). Daher empfehle ich persönlich, Ihr aktuelles Arbeitsverzeichnis zu fixieren und die Verkettung von Pfaden mit Hilfe von Stringmanipulation durchzuführen.

Um herauszufinden, ob ein Pfad ein Verzeichnis ist oder nicht (und damit, ob Sie es opendir() sollte), empfehle ich lstat() mit eher als stat(), da diese symbolischen Links folgt, Ihr Directory-Traversal-Sinn in einer Schleife gefangen werden konnte und du wirst mit etwas enden like this ctags output.

Da die Verzeichnisstruktur von Natur aus rekursiv ist, spielt die Rekursion natürlich eine natürliche Rolle im Traversalprozess: einen rekursiven Aufruf ausführen, wenn ein untergeordneter Pfad ein Verzeichnis ist.

Verwandte Themen