Changement d'extension de multiples fichiers

Résolu
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Dernière intervention
2 septembre 2018
- 13 avril 2018 à 17:22
vb95
Messages postés
2629
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
13 mai 2022
- 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 fExt;
string fnExt = ".xbxo";
string fFromName;
string fToName;

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.

Merci d'avance.

3 réponses

Whismeril
Messages postés
17326
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 mai 2022
596
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),

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

0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Derniè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..
0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Derniè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.
0
Whismeril
Messages postés
17326
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 mai 2022
596
13 avril 2018 à 18:54
Ben non, et pour 2 raisons:
  • "toto.txt"
    pour C# c'est un chemin relatif, ça veut dire
    "répertoire de l'exe en cours\toto.txt"
    , de même,
    "tutu\toto.txt"
    veut dire
    "répertoire de l'exe en cour\tutu\toto.txt"
  • toto n'est pas un chemin du tout.


Ce que tu codes c'est
File.Move("toto", "toto.csv");
. Ça ne peut pas marcher, et contrairement à ce que tu dis, en lisant correctement la doc et en exécutant pas à pas tu aurais pu le voir par toi même.

De tête (et par conséquent sans test)
string ext = Path.GetExtension(f.Name);
string nouveauNom = f.Name.Replace(ext, ".csv");//là on converse le chemin complet
Path.Move(f.Name, nouveauNom);//là aussi


Mais vu, que Path propose une méthode qui fait le job, pourquoi ne pas tout simplement pas s'en servir?
0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Dernière intervention
2 septembre 2018

13 avril 2018 à 19:04
Bref comme je le disais, tu viens exactement de me montrer une méthode que j'avais utilisée et qui ne fonctionnait pas car comme dit plus haut, le logiciel cherche donc le fichier avec le chemin dans son nom (au passage Path.Move n'existe pas, et Path.ChangeExtension (que j'ai essayé au cas où) ne fait juste rien du tout, ni erreur ni résultat)

Que veux-tu dire par "Path propose une méthode qui fait le job" ? Si tu parles de "Path.ChangeExtension", comme dis plus haut, il ne fait rien (et je ne sais pas pourquoi d'ailleurs)
0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Dernière intervention
2 septembre 2018

13 avril 2018 à 19:26
Même avec ce code j'obtient la même erreur, il cherche le fichier dans le dossier local..
            string fExt;
string fnExt = ".pwned";
string fFromName;
string fToName;

string fPath = @"C:\Users\ToxicHayabusa\Desktop\Test";
FileInfo[] files = new DirectoryInfo(fPath).GetFiles();
foreach (var f in files)
{
//get the filename without the extension
fFromName = Path.GetFileNameWithoutExtension(f.Name);
//get the file extension
fExt = Path.GetExtension(f.Name);


fToName = Path.ChangeExtension(fPath + fFromName, fnExt);

//rename the file by moving to the same place and renaming
File.Move(fFromName + fExt, fToName);
}

https://image.noelshack.com/fichiers/2018/15/5/1523640390-894ef.png
0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Derniè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.
0
vb95
Messages postés
2629
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
13 mai 2022
151
Modifié le 13 avril 2018 à 23:09
Bonsoir !
La solution est ici

string newextension = ".xbxo";
string filename;
string fpath = @"D:\Test\";
FileInfo[] files = new DirectoryInfo(fpath).GetFiles();
foreach (FileInfo f in files)
{
filename = Path.ChangeExtension(f.Name, newextension);
File.Move(fpath + f.Name, fpath + filename);
}


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 !
0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Derniè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..)
0
vb95
Messages postés
2629
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
13 mai 2022
151
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 !

regarde cette ligne doit être

string fPath = @"C:\Users\ToxicHayabusa\Desktop\Test\";

et non
string fPath = @"C:\Users\ToxicHayabusa\Desktop\Test";


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)
0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Derniè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..)
0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Derniè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é ?
0
vb95
Messages postés
2629
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
13 mai 2022
151
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
0
ToxicHayabusa
Messages postés
882
Date d'inscription
dimanche 7 décembre 2014
Statut
Membre
Derniè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 ?
0