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

Signaler
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33030-recuperer-la-liste-des-fichiers-avec-ou-sans-extension-precise-d-une-arborescence

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
Effectivement, si tu prends les choses dans ce sens là, ça se tiens :D
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
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
Messages postés
6
Date d'inscription
jeudi 11 mars 2004
Statut
Membre
Dernière intervention
24 août 2005

Merci ca me suffira pour le moment..:)
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
c'est moche mais, un try/catch ferait l'affaire...
Messages postés
6
Date d'inscription
jeudi 11 mars 2004
Statut
Membre
Dernière intervention
24 août 2005

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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
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 :-)
Messages postés
6
Date d'inscription
jeudi 11 mars 2004
Statut
Membre
Dernière intervention
24 août 2005

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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
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 :-)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
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);
Messages postés
109
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
4 juin 2008

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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
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.
Messages postés
109
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
4 juin 2008

Oups pardon pour le i...

Mais avec les Generics du Framework 2.0, ça devrait fonctionner, je pense!
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
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.
Messages postés
109
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
4 juin 2008

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;
}

???
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
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;
}
Messages postés
109
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
4 juin 2008

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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
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.
Messages postés
109
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
4 juin 2008

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!
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
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
Messages postés
109
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
4 juin 2008

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)!
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
sinon... y a tout simplement :
string[] System.IO.Directory.GetFiles(string path, string searchPattern)
string[] System.IO.Directory.GetFiles(string path)