2010-10-26 15 views
8

Je dois faire un programme où j'ai besoin d'indexer les fichiers dans un répertoire spécifié. J'ai réduit la partie indexation, mais ce qui me pose problème, c'est comment naviguer vers le répertoire. Par exemple, disons quand je démarre le programme, il demandera "Quel répertoire aimeriez-vous indexer", Et puis l'entrée serait "usr/Documents/CS/Assignment4", comment puis-je obtenir le répertoire "Assignment4" ? Je sais que la récursivité est nécessaire, mais je suis vraiment confus quant au fonctionnement des répertoires en C. Dites que mon fichier source se trouve dans "usr/Documents/SourceCode", alors que dois-je faire pour accéder à Affectation4? Je sais que j'ai l'air de vouloir connaître toutes les réponses, mais je suis complètement perdu en ce qui concerne le fonctionnement des répertoires et le livre que j'ai craint. Donc, même si tout ce que vous avez est un lien vers un bon tutoriel sur ce sujet, ce serait fantastique. Je suis sous Linux, Ubuntu pour être exact. GCC est le compilateur.En C, comment accéder à un répertoire spécifié?

+0

Une solution simple peut être d'exécuter le programme dans le répertoire que vous souhaitez indexer. On dirait que vous écrivez l'utilitaire système 'ls -e':) – Marm0t

Répondre

7

Le langage de programmation C n'a pas la notion d'un système de fichiers. C'est plutôt une question spécifique au système d'exploitation.

Basé sur le style de répertoire de votre question, même s'il semble que vous utilisiez un système de type unix/linux. Si tel est le cas, alors vous êtes à la recherche de la fonction opendir

0

Le nom du répertoire est seulement une chaîne.

Donc opendir ("nomfichier"); permettra de lire le répertoire "fichier".

Cependant, vous devriez peut-être commencer à penser dans les noms de fichiers et les chemins. "Usr/Documents/SourceCode" + "/../CS/Assignment4" est le même que "usr/Documents/CS/Assignment4" mais je suppose qu'il vous manque le "/" principal.

Eh bien, je ne comprends pas comment vous pouvez perdre le fonctionnement des répertoires. Un répertoire n'est rien d'autre qu'un "dossier" sous Windows ou Mac OS X. Un disque dur a un système de fichiers et un système de fichiers est constitué uniquement de dossiers/répertoires qui "contiennent" des fichiers (et des fichiers spéciaux comme des sockets nommés etc. cela ne devrait pas vous intéresser maintenant).

J'espère que cela a aidé au moins un peu.

Angelo

+0

Je suis désolé, j'ai mal écrit. pas perdu quant à la façon dont les répertoires fonctionnent, juste comment travailler avec eux en C. Comme comment parcourir les répertoires, etc. – sx2000

1

traversant récursive un répertoire C ressemble à ceci:

Utilisez opendir et readdir à la liste des entrées du répertoire. Je ne devrais probablement pas le faire, mais je publie un exemple de code complet (sans traitement des erreurs) car il y a un tas de petites choses à faire pour s'assurer que vous utilisez correctement 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 */ 
} 

Lorsque vous travaillez avec chaque fichier, assurez-vous de lui ajouter un lien vers le répertoire (avec une barre oblique, si nécessaire). Vous pouvez également utiliser chdir pour descendre et monter, mais cela présente des complications en pratique (par exemple, vous ne pouvez pas traverser deux répertoires simultanément), donc je vous recommande de garder votre répertoire de travail actuel et d'utiliser la manipulation de chaînes pour concaténer les chemins.

Pour savoir si un chemin est un répertoire ou non (et donc si vous devez opendir()), je recommande d'utiliser lstat() plutôt que stat(), comme celui-ci suit les liens symboliques, ce qui signifie votre directory traversal pourrait se coincer dans une boucle et vous finirez avec quelque chose like this ctags output.

Bien sûr, étant donné que la structure de répertoire est de nature récursive, la récursivité joue un rôle naturel dans le processus de traversée: effectuez un appel récursif lorsqu'un chemin enfant est un répertoire.