ToxicHayabusa
Messages postés882Date d'inscriptiondimanche 7 décembre 2014StatutMembreDernière intervention 2 septembre 2018
-
13 avril 2018 à 17:22
vb95
Messages postés3407Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention24 mars 2023
-
14 avril 2018 à 17:35
Bonjour,
Je rencontre récemment un problème dans un code C#. En effet mon but est de détecter automatiquement tout les fichiers présents dans un dossier donné et d'en changer leur extension.
J'ai donc essayé de faire ceci à partir de ce code :
string fPath = @"C:\Users\ToxicHayabusa\Desktop\Test"; FileInfo[] files = new DirectoryInfo(fPath).GetFiles(); foreach (var f in files) { fFromName = Path.GetFileNameWithoutExtension(f.Name);
fExt = Path.GetExtension(f.Name);
fFromName = string.Format("{0}", f.Name);
fToName = string.Format("{0}{1}", f.Name, fnExt);
File.Move(fFromName, fToName);
}
Ce code est un mélange que j'ai pu faire à partir de deux codes trouvés sur internet...Malheureusement il ne fonctionne pas comme je le voudrais. En effet, là où ça bloque c'est à la dernière ligne, pour le File.Move, car lorsque la commande est donc censé remplacer les anciens fichiers avec les nouveaux portant la nouvelle extension, celui-ci cherche les fichiers dans le dossier local et non dans le dossier précisé au début du code..
Je ne sais pas si le code est maladroit ou mal fait, malgré mes recherches je n'ai pas trop réussit à comprendre les méthodes utilisé pour tout ça et donc il se peut que le code soit même totalement faux, c'est pour cela que je requiert votre aide, pour m'indiqué là où se trouverait le problème et même corriger mon code si possible.
Whismeril
Messages postés18290Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention24 mars 2023622 13 avril 2018 à 17:36
Bonjour
trouver des bouts de code sur internet c'est une chose, mais les fusionner sans comprendre c'est pas le mieux.
Pour les comprendre, y'a 2 options (cumulables),
exécuter en pas à pas et regarder le résultat de chaque étapes.
Si tu avais appliqué une seule des ces 2 options, tu n'aurais pas posé cette question, car tu aurais vu que
Path.GetFileNameWithoutExtension(f.Name);
ne retourne que le nom du fichier et pas le chemin complet.
Donc tu aurais peut-être demandé comment changer ton extension et là encore, en lisant la doc en ligne ou même en ayant un peu de curiosité avec la class Path (qu'est ce propose intellisense que je tape Path. ?), tu aurais pu voir la méthode ChangeExtension https://msdn.microsoft.com/en-us/library/system.io.path.changeextension(v=vs.110).aspx
ToxicHayabusa
Messages postés882Date d'inscriptiondimanche 7 décembre 2014StatutMembreDernière intervention 2 septembre 2018 13 avril 2018 à 18:33
Oui ok, sauf que tout ça je l'ai déjà lu au par avant, et que je sais que
Path.GetFileNameWithoutExtension(f.Name);
ne retourne que le nom du fichier. Sauf que j'ai déjà essayé avec une précédente méthode (d'ailleurs la doc de microsoft ne sert pas à grand chose) où j'implémentais le chemin du fichier dans le nom, et le logiciel se contentait de chercher le fichier avec le chemin dans le nom..
ToxicHayabusa
Messages postés882Date d'inscriptiondimanche 7 décembre 2014StatutMembreDernière intervention 2 septembre 2018 Modifié le 13 avril 2018 à 18:35
D'ailleurs au début du code le chemin est déjà préciser
string fPath = @"C:\Users\ToxicHayabusa\Desktop\Test"; FileInfo[] files = new DirectoryInfo(fPath).GetFiles();
Donc je vois pas où est le problème ? Pour moi, le code est censé toujours chercher les fichiers dans ce chemin, puisqu'il les a bien trouvé au début.
ToxicHayabusa
Messages postés882Date d'inscriptiondimanche 7 décembre 2014StatutMembreDernière intervention 2 septembre 2018 13 avril 2018 à 22:22
Voici l'image.
En revanche le code donné résume simplement mon code actuel, pour preuve je l'ai testé, et il fait exactement la même erreur que mon code.
vb95
Messages postés3407Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention24 mars 2023165 Modifié le 13 avril 2018 à 23:09
Lors du File.Move il faut préciser le répertoire des fichiers sinon C# prend le dossier de l'application par défaut : c'est cela que l'on appelle un chemin relatif comme dit Whismeril !
ToxicHayabusa
Messages postés882Date d'inscriptiondimanche 7 décembre 2014StatutMembreDernière intervention 2 septembre 2018 14 avril 2018 à 00:47
J'apprécie l'aide proposée, en revanche, comme je l'ai dis plus haut cette méthode ne fonctionne pas. Je ne suis pas débile non plus, j'ai très bien compris la méthode et comment elle est censée fonctionner, et j'ai aussi essayé de mon côté plusieurs possibilités de code, toutes menant à la même erreur.
(Au passage, avec votre méthode VB95, le programme rajoute même le nom du dossier en plus du chemin au nom du fichier qu'il cherche..)
vb95
Messages postés3407Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention24 mars 2023165 Modifié le 14 avril 2018 à 01:46
Bonsoir !
J'ai moi-même testé sur 2 fichiers dans un répertoire et elle fonctionne très bien
As-tu bien mis un antislash à la fin de la String fpath ?
Car entre Test et 456.pxd il n'y est pas ce qui fait qu'il ne peut pas trouver les fichiers !
et aussi remplace var par FileInfo dans le foreach car f est une variable de type FileInfo
De plus tu écris : (Au passage, avec votre méthode VB95, le programme rajoute même le nom du dossier en plus du chemin au nom du fichier qu'il cherche..)
le nom du dossier c'est le chemin et pour chercher un fichier il faut
1) son chemin ( le répertoire où il se trouve )
2) son nom avec l'extension
filename et f.name ne sont que les noms des fichiers . il faut rajouter fpath qui est le chemin de ces fichiers ( le répertoire qui les contient)
ToxicHayabusa
Messages postés882Date d'inscriptiondimanche 7 décembre 2014StatutMembreDernière intervention 2 septembre 2018 14 avril 2018 à 01:38
Ok, le problème venait simplement de l'anti slash, j'avoue ne pas avoir pensé à ça...Merci de l'aide !
Comme quoi, rien ne sert de s'énerver à m'expliquer 30 fois la même chose, le mieux serait encore de bien regarder mon code :) (surtout qu'il n'est pas très long..)
ToxicHayabusa
Messages postés882Date d'inscriptiondimanche 7 décembre 2014StatutMembreDernière intervention 2 septembre 2018 14 avril 2018 à 01:42
En revanche est-ce que vous connaîtriez un moyen d'inclure aussi les sous dossiers du dossier spécifié ?
vb95
Messages postés3407Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention24 mars 2023165 14 avril 2018 à 01:56
En se servant de la récursivité !
Si on corrige ton code tout bêtement tu n'apprendras rien !
En te faisant comprendre tes erreurs tu progresseras
ToxicHayabusa
Messages postés882Date d'inscriptiondimanche 7 décembre 2014StatutMembreDernière intervention 2 septembre 2018 Modifié le 14 avril 2018 à 02:30
Oui mais bon, pour ce genres de choses, je ne vois pas en quoi je n'aurais rien appris...Vu que c'était juste un caractère oublié.
Sinon j'ai essayé un code comme ceci :
string fnExt = ".pwned";
string filename;
string npath;
string fPath = @"C:\Users\ToxicHayabusa\Desktop\Test\";
FileInfo[] files = new DirectoryInfo(fPath).GetFiles();
string[] folders = Directory.GetDirectories(fPath);
foreach (var f in files)
{
filename = Path.ChangeExtension(f.Name, fnExt);
File.Move(fPath + f.Name, fPath + filename);
}
foreach (var d in folders)
{
npath = Path.GetDirectoryName(d);
FileInfo[] nfiles = new DirectoryInfo(npath).GetFiles();
foreach (FileInfo f in nfiles)
{
filename = Path.ChangeExtension(f.Name, fnExt);
File.Move(npath + f.Name, npath + filename);
}
}
Mais ça n'a pas l'air de fonctionné du tout...Est-ce que je suis dans la mauvaise direction ou bien y'a des choses qui pourraient fonctionner dedans ? (et donc dans ce cas il faut que je continue à chercher à modifier le code pour qu'il fonctionne..)
(ps : je viens de voir que les balises de code C# semblent un peu buggées..)
EDIT:Je viens de lire la doc Microsoft sur Path.GetDirectoryName, je comprend mieux pourquoi ça ne fonctionne pas, mais y a-t-il un moyen d'obtenir le nom du dossier concerné ? Et non sa racine ?
13 avril 2018 à 18:33
Modifié le 13 avril 2018 à 18:35
Donc je vois pas où est le problème ? Pour moi, le code est censé toujours chercher les fichiers dans ce chemin, puisqu'il les a bien trouvé au début.