45

使用System.IO.File或其他.NET类,重命名文件的最佳方法是什么?

我希望能够重命名本地驱动器或网络位置上的文件。

如果使用System.IO.File,是Move最好的方法吗?

4

1 回答 1

91

备择方案

系统.IO.文件.移动

您可以像这样重命名文件System.IO.File.Move

var sourcePath = @"C:\folder\oldname.txt";
var destinationPath = @"C:\folder\newname.txt";
File.Move(sourcePath, destinationPath);

您可能有兴趣保持相同的位置,只需更改文件名。当然可以这样做:

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

您还可以使用System.IO.FileInfo.MoveTo

var sourcePath = @"C:\folder\oldname.txt";
var destinationPath = @"C:\folder\newname.txt";
FileInfo info = new FileInfo(sourcePath);
info.MoveTo(destinationPath);

注意:您还可以构建目标路径,如上所示。


《手举》

显然,您总是可以打开现有文件,创建一个具有所需名称的新文件...将比赛从旧文件复制到新文件,最后删除旧文件。如果您具有写入权限,这将起作用,尽管日期和安全信息(文件所有者等)不会被保留。

您可以在如何 将一个文件的内容写入另一个文件?.


笔记

注 1:其他替代方案包括:Microsoft.VisualBasic.FileSystem.RenameMicrosoft.VisualBasic.FileIO.FileSystem.RenameFile

两者Microsoft.VisualBasic.FileSystem.RenameSystem.IO.File.Move是等效的,它们在MoveFilefrom周围进行参数检查、权限检查和错误处理kernel32

关于Microsoft.VisualBasic.FileIO.FileSystem.RenameFile,它将在给定完整路径和新名称的情况下重命名同一文件夹中的文件(类似于我上面介绍的构建目标路径的内容),然后回退到MoveFilefrom kernel32

以类似的方式System.IO.FileInfo.MoveTo将调用MoveFilefrom kernel32

注 2:还应注意,您无法Microsoft.VisualBasic从 Mono 中找到。这意味着System.IO.File.Move并且System.IO.FileInfo.MoveTo是唯一的便携式选项。


这都是MoveFile。

如上所述,所有这些方法都将回退到MoveFilefrom kernel32MoveFile将适用于系统上任何已安装的驱动器(甚至网络驱动器),尽管它不应该用于从一个卷移动到另一个卷。在这种情况下,有必要将文件复制到目标位置并删除旧文件。


最佳选择

由于Microsoft.VisualBasic.FileSystem.RenameandMicrosoft.VisualBasic.FileIO.FileSystem.RenameFile可能不会在其他操作系统中使用,因为它们没有被 Mono 移植,我将丢弃它们。

所以,我们剩下System.IO.File.MoveSystem.IO.FileInfo.MoveTo。这些之间的System.IO.File.Move开销较小,因为它不必维护FileInfo对象的状态。除此之外,它们的工作方式相同......所以,如果您已经在使用FileInfouse System.IO.FileInfo.MoveToelse System.IO.File.Move

因此,System.IO.File.Move是在 .NET 中重命名文件的最佳选择!(他们没有给我们一个古怪的 API)。

庆祝!

于 2013-12-21T23:05:09.487 回答