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

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 - 2 août 2005 à 12:23
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 13 août 2005 à 11:57
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
13 août 2005 à 11:57
Effectivement, si tu prends les choses dans ce sens là, ça se tiens :D
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 août 2005 à 11:46
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
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 août 2005 à 21:35
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
cs_djforever Messages postés 6 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 24 août 2005
11 août 2005 à 15:24
Merci ca me suffira pour le moment..:)
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
11 août 2005 à 14:51
c'est moche mais, un try/catch ferait l'affaire...
cs_djforever Messages postés 6 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 24 août 2005
11 août 2005 à 14:34
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
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 août 2005 à 22:54
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 :-)
cs_djforever Messages postés 6 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 24 août 2005
10 août 2005 à 16:34
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
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 août 2005 à 19:36
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 :-)
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 août 2005 à 11:52
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);
Chris_LaFouine Messages postés 109 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 4 juin 2008
5 août 2005 à 16:55
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
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
5 août 2005 à 16:52
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.
Chris_LaFouine Messages postés 109 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 4 juin 2008
5 août 2005 à 16:48
Oups pardon pour le i...

Mais avec les Generics du Framework 2.0, ça devrait fonctionner, je pense!
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
5 août 2005 à 16:45
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.
Chris_LaFouine Messages postés 109 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 4 juin 2008
5 août 2005 à 16:07
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;
}

???
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
5 août 2005 à 15:51
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;
}
Chris_LaFouine Messages postés 109 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 4 juin 2008
5 août 2005 à 12:03
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
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
5 août 2005 à 10:40
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.
Chris_LaFouine Messages postés 109 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 4 juin 2008
5 août 2005 à 10:04
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!
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
4 août 2005 à 15:55
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
Chris_LaFouine Messages postés 109 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 4 juin 2008
2 août 2005 à 12:44
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)!
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
2 août 2005 à 12:23
sinon... y a tout simplement :
string[] System.IO.Directory.GetFiles(string path, string searchPattern)
string[] System.IO.Directory.GetFiles(string path)
Rejoignez-nous