2010-10-26 8 views
8

Devo eseguire un programma in cui è necessario indicizzare i file in una directory specificata. Ho ottenuto la parte indicizzata, ma quello che sto avendo problemi è come navigare nella directory. Ad esempio, quando avvio il programma chiederà "Quale directory desideri indicizzare", quindi l'input sarebbe "usr/Documents/CS/Assignment4", come posso accedere alla directory "Assignment4" ? So che la ricorsione è necessaria, ma sono davvero confuso su come funzionano le directory in C. Dì che il mio file sorgente è in "usr/Documents/SourceCode", quindi cosa dovrei fare per arrivare a Assignment4?In C, come ottenere una directory specificata?

So che suono come se volessi tutte le risposte, ma sono completamente perso su come funzionano le directory e il libro che ho fatto schifo. Quindi, anche se tutto ciò che hai è un link a un buon tutorial su questo, sarebbe fantastico.

Sono in esecuzione Linux, Ubuntu per la precisione. GCC è il compilatore.

+0

Una soluzione semplice può essere quella di eseguire il programma nella directory che si desidera indicizzare. Sembra che tu stia scrivendo l'utilità di sistema "ls -e":) – Marm0t

risposta

7

Il linguaggio di programmazione C non ha una nozione di file system. Questa è invece una domanda specifica del sistema operativo.

In base allo stile della directory nella tua domanda, sembra che tu sia su un sistema stile unix/linux. Se questo è il caso, allora siete alla ricerca per la funzione opendir

0

Il nome della directory è solo una stringa.

Quindi opendir ("nomefile"); renderà possibile leggere la directory "file".

Tuttavia dovresti forse iniziare a pensare ai nomi dei file e ai percorsi.

"usr/Documents/SourceCode" + "/../CS/Assignment4" è lo stesso di "usr/Documents/CS/Assignment4" tuttavia, presumo che manchi il "/" iniziale.

Bene, non capisco come si possa perdere il funzionamento delle directory. Una directory non è diversa da una "cartella" in Windows o in Mac OS X. In fondo un disco rigido ha un filesystem e un filesystem consiste solo di cartelle/directory che contengono file (e file speciali come socket nominati ecc. , questo non dovrebbe interessarti in questo momento).

Spero che questo abbia aiutato almeno un po '.

Angelo

+0

Mi dispiace, ho sbagliato. non perso come funzionano le directory, solo come lavorare con loro in C. Come come le directory traverse, ecc. – sx2000

1

ricorsivamente attraversare una directory in C più o meno così:

Usa opendir e readdir per elencare le voci della rubrica. Probabilmente non dovrei farlo, ma sto postando un esempio di codice completo (senza errori di gestione) perché ci sono un sacco di piccole cose che devi fare per assicurarti di usare correttamente l'API:

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 */ 
} 

Quando si lavora con ciascun file, assicurarsi di anteporre il dirpath ad esso (insieme a una barra, se necessario). Puoi anche usare chdir per scendere e salire, ma in pratica introduce delle complicazioni (ad esempio non puoi attraversare due directory contemporaneamente), quindi personalmente raccomando di mantenere ferma la directory di lavoro corrente e di utilizzare la manipolazione delle stringhe per concatenare i percorsi.

per verificare se il percorso è una directory o meno (e quindi se si deve opendir() esso), mi consiglia di utilizzare lstat() piuttosto che stat(), in quanto quest'ultimo segue i link simbolici, il che significa la vostra directory traversal potrebbero impigliarsi in un ciclo e finirai con qualcosa di like this ctags output.

Ovviamente, poiché la struttura delle directory è di natura ricorsiva, la ricorsione svolge un ruolo naturale nel processo di attraversamento: effettuare una chiamata ricorsiva quando un percorso figlio è una directory.