7
votes

Comment traverser récursivement des répertoires en C sous Windows

En fin de compte, je veux parcourir les fichiers et les sous-répertoires d'un dossier et écrire quelque chose à tous les fichiers que je trouve qui ont une certaine extension (.wav dans mon cas). Lors de la boucle Comment puis-je dire si l'article que je suis à est un répertoire?


3 commentaires

Les répertoires de traversée dépendent du système d'exploitation. Vous devez donc probablement nous dire quel OS vous utilisez. Il existe certaines bibliothèques indépendantes du système d'exploitation. Si vous utilisez l'un d'entre eux, nous devrons savoir qui donner une bonne réponse.


Est-ce une plate-forme UNIX-Y (MAC, etc.) ou Windows, ou quelque chose d'autre entièrement? De nombreuses plates-formes prendront en charge les normes POSIX ( ROBOT.MBHS.EDU/WordPress/2009/... ), mais il aura également leur propre mode de faire, ESP Windows (FindFirstFile / FindNextFile)


Je ne comprends toujours pas cela pour travailler comment je veux. FindFirstFile émet le nom du répertoire dans lequel je suis dans le répertoire, pas le premier fichier dans le répertoire si je laissez le suivi /. Si je mettez le traction / c'est lui donnant un nom de fichier étrange (AAAAA-LIBVC ...). En outre, les deux fois FINTNEXTFILE ne reviendra pas de valeur du tout


4 Réponses :


-1
votes

Opendir et ReadDir (sur UNIX), voici un exemple:

http: //opengroup.org/onlinepubs/007908775/xsh/readdir.html

ou FindFirstFile sur Windows

Vous pouvez également utiliser la coque assez facilement: xxx


1 commentaires

Oups, j'ai oublié de dire que je fais cela sur Windoze aussi.



3
votes

Basé sur votre mention de .wav , je vais deviner que vous écrivez le code pour Windows (qui semble être où *. WAV Les fichiers sont les plus commun). Dans ce cas, vous utilisez FindFirstFile et FindNextFile pour traverser les répertoires. Celles-ci utilisent une structure win32_find_data , qui a un membre dwfileattributes qui contient des indicateurs en disant les attributs du fichier. Si Dwattributes & File_Attribute_Directory n'est pas zéro, vous avez le nom d'un répertoire.


2 commentaires

Oui, je le fais sur Windows. Mon C est vraiment rouillé, n'a pas été programmé en C pendant quelques années. J'essayais d'utiliser Dirent.h, mais je ne pense pas qu'il offre une façon de dire si l'élément est un répertoire ou non. Vous ne pouvez pas trouver un bon exemple de FindFirstFile de Google


Cette page montre comment les utiliser (en VB, mais la traduction to c doit être plus ou moins simple en avant): support.microsoft.com/kb/185476 . Notez que vous voudrez peut-être aussi réfléchir à la façon dont vous avez la main sur les jonctions NTFS, c'est-à-dire de savoir s'il faut les suivre ou non, et si vous faites comment éviter les boucles sans fin.



7
votes

Voici comment vous le faites (tout est de la mémoire de sorte qu'il peut y avoir des erreurs): xxx

afin que vous puissiez appeler cela comme xxx

Pour trouver tous les fichiers * .wAV en C: \ Windows et ses sous-répertoires.

techniquement, vous ne devez pas faire deux appels FindFirstFile (), mais je trouve les fonctions de correspondance des motifs Microsoft fournit (pathmatchfileSpec ou autre) ne sont pas aussi compétents que FindFirstFile (). Bien que pour "* .wav" ça irait probablement bien.


1 commentaires

Outre un couple de type mineur, il fonctionne très bien. @Neilweicher Il y a un bouton d'édition afin que vous puissiez réparer ces fautes de frappe mineures.



2
votes

Très utile. J'avais quand même, un débordement de pile car il ajoutait toujours "". au chemin et retourner au même chemin = boucle sans fin.

Ajout de cela résolu:

// a trouvé un sous-répertoire; se recueillir Pathcommine (Szfullptern, LPFolder, FindFileData.cfilename); FindFilesRecursivement (Szfullpattern, LPTattern); Si (FindFileData.cfilename [0] == '.') Continuer;


1 commentaires

Cela exclurait Tous les annuaires commençant par une période (y compris des répertoires cachés provenant de * Nix Systems).