web-dev-qa-db-fra.com

Comment renommer un fichier en .NET?

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?

38
CJ7

Alternatives

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.


C'est tout MoveFile.

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.


La meilleure alternative

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 !

76
Theraot