begin process at 2010 02 10 11:47:36
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > RÉCUPÉRER LA LISTE DES FICHIERS (AVEC OU SANS EXTENSION PRÉCISE) D'UNE ARBORESCENCE

RÉCUPÉRER LA LISTE DES FICHIERS (AVEC OU SANS EXTENSION PRÉCISE) D'UNE ARBORESCENCE


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Source .NET ( DotNet ) Classé sous :getfiles Niveau :Initié Date de création :02/08/2005 Date de mise à jour :05/08/2005 12:00:20 Vu :16 105

Auteur : Chris_LaFouine

Ecrire un message privé
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

Cette fonction renvoie un tableau de string avec le chemin d'accès de tous les fichiers se trouvant dans l'arborescence spécifiée en paramètre. exemple d'utilisation :

//Renvoie tous les chemins d'accès des fichiers contenus dans D: et ses sous-dossiers
String[] tab= getFilesInDirectory("d:\\","")

//Renvoie tous les chemins d'accès des fichiers contenus dans D: et ses sous-dossiers ayant l'extension .mp3 ou .avi
String[] tab= getFilesInDirectory("d:\\","mp3;avi")

Source

  • private String[] getFilesInDirectory(String path,String ext)
  • {
  • try {
  • //Déclarations
  • List<String> lst;
  • String[] tabExt = ext.Split(';');
  • Int32 i, j;
  • Boolean trouve;
  • //On copie tous les "fichiers" du répertoire path...
  • //... dans le tableau lst
  • lst.AddRange(dir.GetFileSystemEntries(path))
  • i = 0;
  • while(i < lst.Count) {
  • /* si le fichier n'a pas l'extension souhaitée...
  • * ou que c'est un répertoire alors...
  • * on supprime la ligne SANS incrémenter i...
  • * car en supprimant, on va "remonter" tous les éléments...
  • * suivant cette référence et l'élément suivant l'élément courant...
  • * n'aurait pas été traité si on aurait incrémenté i
  • */
  • trouve = false;
  • //Si c'est un dossier
  • if(System.IO.Directory.Exists(file)) {
  • //On ajoute tous les éléments de ce dossier (fichiers+répertoires)
  • lst.AddRange(getFilesInDirectory(lst[i], ext));
  • }
  • else {
  • //test d'extension
  • j = 0;
  • while(!trouve && j <= nbExt - 1) {
  • //Test de l'extension
  • if(lst.EndsWith("." + tabExt[j])) {
  • trouve = true;
  • }
  • else {
  • j++;
  • }
  • }
  • }
  • //S'il a pas trouvé les extensions ou que c'est un dossier... on le supprime
  • if(!trouve) {
  • lst.RemoveAt(i);
  • }
  • else {
  • i ++;
  • }
  • }
  • return lst.ToArray();
  • }
  • catch {
  • return(null);
  • }
  • }
private String[] getFilesInDirectory(String path,String ext)
{
	try {					
		//Déclarations
		List<String> lst;
		String[] tabExt = ext.Split(';');
		Int32 i, j;
		Boolean trouve;

		//On copie tous les "fichiers" du répertoire path...
		//... dans le tableau lst	            
		lst.AddRange(dir.GetFileSystemEntries(path))

		i = 0;
		while(i < lst.Count) {		
			/* si le fichier n'a pas l'extension souhaitée...
			* ou que c'est un répertoire alors...
			* on supprime la ligne SANS incrémenter i...
			* car en supprimant, on va "remonter" tous les éléments...
			* suivant cette référence et l'élément suivant l'élément courant...
			* n'aurait pas été traité si on aurait incrémenté i
			*/

			trouve = false;

			//Si c'est un dossier
			if(System.IO.Directory.Exists(file)) {
				//On ajoute tous les éléments de ce dossier (fichiers+répertoires)
				lst.AddRange(getFilesInDirectory(lst[i], ext));
			}
			else {
				//test d'extension
				j = 0;
				while(!trouve && j <= nbExt - 1) {
					//Test de l'extension
					if(lst.EndsWith("." + tabExt[j])) {
						trouve = true;
					}
					else {
						j++;
					}
				}
			}

			//S'il a pas trouvé les extensions ou que c'est un dossier... on le supprime
			if(!trouve) {
				lst.RemoveAt(i);
			}
			else {
				i ++;
			}
		}

		return lst.ToArray();
	}
	catch {
		return(null);
	}
}

 Conclusion

Attention tout de même, j'utilise des Generics donc faut le Framework 2.0!!!
Par contre, j'ai déjà ce code en VB.NET 1.1... je viens de le faire à l'arach' en C# 2.0!!! Donc, c'est possible qu'il y ait des erreurs!
Je teste dès que je peux!


 Historique

05 août 2005 11:08:49 :
J'avais oublié d'enlever une ligne IMPORTANTE qui était en commentaire!
05 août 2005 11:17:08 :
Bon, c'est bon, je viens encore de m'apercevoir que j'ai fait des conneries... le code est optimisé (et doit fonctionner!!!)
05 août 2005 11:19:20 :
Désolé... problèmes d'indentation! C'est bon MAINTENANT!!! :D
05 août 2005 11:25:06 :
Oui, je sais ce que vous allez dire... Quand est-ce que ça va vraiment fonctionner... Faut croire que maintenant, c'est mieux (j'avais oublier de remplacer le : if(lst.EndsWith("." + tabExt(j))) { par : if(lst.EndsWith("." + tabExt[j])) { Je suis désolé!!!
05 août 2005 12:00:20 :
Un petit coup d'optimisation encore une fois! J'ai viré le "trouve=true" dans le Bloc du premier IF car il était inutile (et surtout faux!)

 Sources de la même categorie

Source avec Zip PILOTER WORD VIA MICROSOFT.OFFICE.INTEROP.WORD par whismeril
Source avec Zip PILOTER EXCEL VIA MICROSOFT.OFFICE.INTEROP.EXCEL par whismeril
Source avec Zip Source .NET (Dotnet) CHECK IDENTICAL FILES par eldim
Source avec Zip Source avec une capture Source .NET (Dotnet) RICHTEXTBOX NUMÉROTÉ (NUMÉROS DE LIGNES) par jray
Source avec Zip Source avec une capture SURVEILLER FICHIERS CRÉÉS AVEC FILESYSTEMWATCHER AMÉLIORÉ par TheOnlyMaX

Commentaires et avis

Commentaire de sebmafate le 02/08/2005 12:23:13 administrateur CS

sinon... y a tout simplement :
   string[] System.IO.Directory.GetFiles(string path, string searchPattern)
   string[] System.IO.Directory.GetFiles(string path)

Commentaire de Chris_LaFouine le 02/08/2005 12:44:37

Ah, je connaissais pas... En effet, c'est plus simple!!!

Mais sinon, mon code donne des idées pour les récursives et pour les Génériques... même si c'est pas forcément utile(ma fonction)!

Commentaire de t_barbillon le 04/08/2005 15:55:34

Salut, perso je pense que ton code peut être utile, il me semble que System.IO.Directory.GetFiles donne juste les fichiers du dossier spécifiés et non tous les fichiers avec le contenu des sous dossiers

Commentaire de Chris_LaFouine le 05/08/2005 10:04:03

En voyant string[] System.IO.Directory.GetFiles(string path, string searchPattern), je me suis dit qu'avec searchPattern, on pouvait récupérer les fichiers des sous-dossiers!

Eh BIEN NON!!!

Donc ma fonction est réellement utile!!!
Merci T_Barbillon de m'avoir enlevé ce doute!!!

Par contre, y a un équivalent du OPTIONAL en C#, je le connais pas... c'est pour pouvoir écrire :
String[] truc = getFilesInDirectory("C:\\");
au lieu de :
String[] truc = getFilesInDirectory("C:\\","");

Sinon, je vais remettre une version qui fonctionne avec le Framework 1.1 dans pas trop longtemps... parce que y en a pas beaucoup qui ont la beta 2.0!

Commentaire de sebmafate le 05/08/2005 10:40:25 administrateur CS

hum... peut-être qu'elle ne donne pas les fichiers des sous-dossiers... mais tu peux faire une fonction récursive qui s'appuie sur GetFiles et GetDirectories.
Ca sera bien plus rapide que ta méthode.
Je ne cherche pas à casser ton code, ou ton idée. Je pense juste qu'il est plus "correct" d'utiliser les outils que le Framework met à notre disposition.

Quant à l'équivalent du Optional en C#... euh... il n'existe pas. Ce que tu vois là, c'est une surcharge. La fonction est "écrite" 2 fois avec un nombre de paramètre différent.

Commentaire de Chris_LaFouine le 05/08/2005 12:03:54

Tout d'abord, je l'admet... j'ai changé plein de trucs, mais c'est juste des erreurs à la con qui ont été dûes à mes traductions approximatives du VB.NET en C#! Mais le code est très peu changé (je vous promets que je ne suis pas de mauvaise foi!).

Sinon, je crois mon cher SEBMAFATE, c'est pas pour te démoraliser, mais je pense que tu n'as pas bien compris le code!

Sache que GetFiles ne renvoie QUE les fichiers...

C'est pour ça que j'ai cette ligne :
lst.AddRange(dir.GetFileSystemEntries(path))

Ça ajoute dans ma List<String>, tout ce que contient le chemin d'accès path, autant des fichiers que des DOSSIERS, grâce à la fonction GetFileSystemEntries()!

Et c'est dans le 1er if/else que je regarde si c'est un fichier ou un dossier...
Si c'est un dossier, je fais ma récursive pour rappeler ma fonction mais avec en paramètre le sous-dossier
Sinon, c'est un fichier et regarde si le fichier spécifié est de l'extension choisie
(trouve=TRUE si l'extension du fichier fait partie de celles que j'ai spécifiées en paramètre ou si ce n'est pas un dossier)

Le 2e if/else regarde si trouve=FALSE et supprime le i-ème élément de la List<String> car on ne le retiendra pas dans la liste!
Si trouve=FALSE... je n'imcrémente pas. C'est super IMPORTANT! regardez ce schéma... vous allez mieux comprendre!

Si je lance ma fonction avec path="C:\\", ma liste aura le contenu suivant :
0 - "C:\\boot.ini"
1 - "C:\\Windows"
2 - "C:\\Program Files"
...

pour i=0, on garde le fichier, maintenant i=1...
"C:\\Windows" est un DOSSIER, donc trouve=FALSE. Bon, j'ajoute tous les éléments se trouvant dans "C:\\Windows" à la fin de ma liste.
Ensuite, dans le 2e if/else, il remarque que trouve=FALSE, donc il passe dans le IF et supprime l'occurence donc on se retrouve avec  ça dans la liste :
0 - "C:\\boot.ini"
1 - "C:\\Program Files"
...
Mais i est toujours égal à 1 donc si je l'incrémente, je ne traiterai pas "C:\\Program Files"!

J'espère que vous avez mieux compris et que vous admettrez que mon code est utile!!! :D

Commentaire de sebmafate le 05/08/2005 15:51:24 administrateur CS

Puisqu'on y est :
public static StringCollection GetAllFiles( string folder, string extension) {
StringCollection files = new StringCollection();
files.AddRange(Directory.GetFiles(folder, extension));

string[] folders = Directory.GetDirectories(folder);
string[] f;
StringCollection temp;
for (int i=0; i<folders.Length; i++) {
temp = GetAllFiles(folders[i], extension);
f = new string[temp.Count];
temp.CopyTo(f, 0);

files.AddRange(f);
temp = null;
f = null;
}
return files;
}

Commentaire de Chris_LaFouine le 05/08/2005 16:07:35

Ah oui, en effet, vu sous cet angle... Je l'avoue c'est mieux... J'ai une question conne... Ça serait pas mieux de faire :

public static StringCollection GetAllFiles( string folder, string extension) {
    Int16 i;
    StringCollection files = new StringCollection();
    files.AddRange(Directory.GetFiles(folder, extension));

    string[] folders = Directory.GetDirectories(folder);
    for (int i=0; i<folders.Length; i++) {
        files.AddRange(GetAllFiles(folders[i], extension));
    }

    return files;
}

???

Commentaire de sebmafate le 05/08/2005 16:45:35 administrateur CS

non... car AddRange prend un tableau de string (string[]), pas une collection.

et puis ton Int16 i; ne sert à rien puisque i est déclaré dans la boucle.

Commentaire de Chris_LaFouine le 05/08/2005 16:48:38

Oups pardon pour le i...

Mais avec les Generics du Framework 2.0, ça devrait fonctionner, je pense!

Commentaire de sebmafate le 05/08/2005 16:52:59 administrateur CS

faut essayer... mais cette solution fonctionne très bien en .NET1.1.
Les generics c'est bien, mais ce n'est pas une raison pour en mettre à toutes les sauces.

Commentaire de Chris_LaFouine le 05/08/2005 16:55:18

Je vais m'y pencher et je vais rajouter ton idée (avec mes optimisations) dans le source... et surtout, je vais le tester!!! :D

Commentaire de Bidou le 06/08/2005 11:52:35 administrateur CS

Euh je ne sais pas si j'ai loupé un épisode, mais cette source me paraît fort inutile, étant donné qu'avec le framework 2.0 il suffit de faire, par exemple :

string[] filesName = System.IO.Directory.GetFiles(@"X:\My Documents", "*.xxx", SearchOption.AllDirectories);

Commentaire de coq le 08/08/2005 19:36:32 administrateur CS

Mais comme tout le monde ne peut et ne pourra pas deployer la version 2.0 tout de suite, cette méthode pourra être utile quand même :-)

Commentaire de djforever le 10/08/2005 16:34:19

Bonjour,
je viens de tester le dernier exemple de sebmafate et j'ai quelques soucis... en fait j'ai l'impression que mon appli ne possède pas les droits ou qu'elles ne trouve que les fichiers présents dans le rep debug ?
- lorsque je fais :
  StringCollection filesSearcher = GetAllFiles("C:\\","*.*");
  textBox2.Text += filesSearcher.Count.ToString();
  textBox2.Text = "FILES :";
  for (int i = 0; i < filesSearcher.Count; i++)
    textBox2.Text += "B"+filesSearcher[i].ToString() +"E";
- j'obtiens :
Une exception non gérée du type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll. Informations supplémentaires : L'accès au chemin d'accès "C:\System Volume Information" est refusé.

Comment puis-je fais pour passer en lecture partout ?
En final je cherche a trouver touts les fichiers présents sur le disque dur en local en passant le noms en param
Merci

Commentaire de coq le 10/08/2005 22:54:41 administrateur CS

Pour ce répertoire là c'est normal, ce n'est pas lié à proprement parler au Framework ou à l'appli, essaie donc d'y aller par explorer :-)

Commentaire de djforever le 11/08/2005 14:34:28

Ok merci, je m'en suis rendu compte.. mais comment contourner ce problème ? y'en a t'il d'autre qui pourrais poser problèmes ?
merci

Commentaire de sebmafate le 11/08/2005 14:51:40 administrateur CS

c'est moche mais, un try/catch ferait l'affaire...

Commentaire de djforever le 11/08/2005 15:24:17

Merci ca me suffira pour le moment..:)

Commentaire de coq le 11/08/2005 21:35:52 administrateur CS

En dehors de catcher l'exception UnauthorizedAccessException je ne vois pas non plus...
Je n'ai pas connaissance de méthode dans le framework pour tester les droits d'accès.
Si ça existe je suis client :-)
Peut être via les APIs mais autant utiliser l'exception :p

Commentaire de Bidou le 13/08/2005 11:46:48 administrateur CS

coq > oui, mais puisque dans la description du programme c'est marqué

"Attention tout de même, j'utilise des Generics donc faut le Framework 2.0!!!
Par contre, j'ai déjà ce code en VB.NET 1.1... je viens de le faire à l'arach' en C# 2.0!!!"

je me dis que le framework 2 est utilisé :D

Commentaire de coq le 13/08/2005 11:57:35 administrateur CS

Effectivement, si tu prends les choses dans ce sens là, ça se tiens :D

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Renommer des fichiers [ par zobyone ] Salut a tousJe voulais faire un petit prog pour renommer des fichiers et je me suis apercu que ce n'etait pas si facile que ca. je voulais savoir si i [C#] Synchronisation FTP [ par jnlorteau ] Bonjour, Je dois developper un Client de synchronisation, j'ai choisi dans un premier temps de faire un parcourt r&#233;cursif des arbres Directory.g Sous repertoire [ par sliverman ] Bonsoir à tous,Alors voila mon problème, j'aimerai récupérer les fichiers des sous dossier associé au répertoire ouvert avec un folderBrowserDialog ma


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales