En utilisant System.IO.File
ou un autre .NET
class, quelle est la meilleure façon de renommer un fichier?
Je veux pouvoir renommer des fichiers sur des disques locaux ou sur des emplacements réseau.
Si vous utilisez System.IO.File
, Move
est-il le meilleur moyen?
System.IO.File.Move
Vous pouvez renommer un fichier avec System.IO.File.Move
comme ça:
var sourcePath = @"C:\folder\oldname.txt";
var destinationPath = @"C:\folder\newname.txt";
File.Move(sourcePath, destinationPath);
Il peut être intéressant de conserver le même emplacement et de simplement changer le nom du fichier. Bien sûr, cela peut être fait:
var sourcePath = @"C:\folder\oldname.txt";
var newName = "newname.txt";
var directory = Path.GetDirectoryName(sourcePath);
var destinationPath = Path.Combine(directory, newName);
File.Move(sourcePath, destinationPath);
System.IO.FileInfo.MoveTo
Vous pouvez aussi utiliser System.IO.FileInfo.MoveTo
:
var sourcePath = @"C:\folder\oldname.txt";
var destinationPath = @"C:\folder\newname.txt";
FileInfo info = new FileInfo(sourcePath);
info.MoveTo(destinationPath);
Remarque: Vous pouvez également créer le chemin de destination comme indiqué ci-dessus.
"Déplacement de la main"
Évidemment, vous pouvez toujours ouvrir le fichier existant, en créer un nouveau avec le nom souhaité ... copier les concours de l'ancien vers le nouveau, et enfin supprimer l'ancien. Cela fonctionnera si vous disposez d'un accès en écriture, bien que les dates et les informations de sécurité (propriétaire du fichier, etc.) ne seront pas conservées.
Vous pouvez voir un exemple de cela à la solution acceptée deComment écrire le contenu d'un fichier dans un autre fichier? .
Notes
Note 1 : D'autres alternatives incluent: Microsoft.VisualBasic.FileSystem.Rename
et Microsoft.VisualBasic.FileIO.FileSystem.RenameFile
.
Tous les deux Microsoft.VisualBasic.FileSystem.Rename
et System.IO.File.Move
sont équivalents, ils vérifient les paramètres, vérifient les autorisations et gèrent les erreurs autour de MoveFile
from kernel32
.
En ce qui concerne Microsoft.VisualBasic.FileIO.FileSystem.RenameFile
, il renommera les fichiers dans le même dossier étant donné le chemin complet et le nouveau nom (similaire à ce que je présente ci-dessus pour créer le chemin de destination), puis retombera dans MoveFile
à partir de kernel32
.
D'une manière similaire System.IO.FileInfo.MoveTo
appellera MoveFile
de kernel32
.
Note 2 : Il convient également de noter que vous ne pouvez pas trouver Microsoft.VisualBasic
de Mono. Cela signifie que System.IO.File.Move
et System.IO.FileInfo.MoveTo
sont les seules options portables.
Comme mentionné ci-dessus, toutes ces méthodes reviendront à MoveFile
à partir de kernel32
. MoveFile
fonctionnera pour tout lecteur monté sur le système (même les lecteurs réseau), bien qu'il ne devrait pas être utilisé pour passer d'un volume à un autre. Dans ce cas, il sera nécessaire de copier le fichier vers la destination et de supprimer l'ancien fichier.
Depuis le Microsoft.VisualBasic.FileSystem.Rename
et Microsoft.VisualBasic.FileIO.FileSystem.RenameFile
ne peut pas être utilisé dans d'autres systèmes d'exploitation car ils ne sont pas portés par Mono, je les supprimerai.
Il nous reste donc System.IO.File.Move
et System.IO.FileInfo.MoveTo
. Entre ces System.IO.File.Move
a moins de surcharge car il n'a pas à maintenir l'état de l'objet FileInfo
. En dehors de cela, ils fonctionneront de la même manière ... donc, si vous utilisez déjà FileInfo
utilisez System.IO.FileInfo.MoveTo
autrement System.IO.File.Move
.
Et donc, System.IO.File.Move
est la meilleure option pour renommer des fichiers en .NET! (Ils ne nous ont pas donné une API délirante).
Célébrez !