如何在.NET中重命名文件?

50

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

我想要能够在本地驱动器或网络位置上重命名文件。

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


一篇涉及你所要做的事情的文章是 *如何在C#中重命名文件?*。 - TGH
自从 Stack Overflow 推出 5 年后,这怎么可能不是重复的问题? - Peter Mortensen
@PeterMortensen 最接近的匹配:在C#中重命名文件。虽然在这种情况下,CJ7知道该方法(System.IO.File),但我认为问题是是否有更好的选项适用于不同驱动器和网络位置。我没有找到明确的声明,如果所提到的API在这些情况下起作用(我的直觉是它会)......但值得提到一些.NET中可用的重命名和移动文件的替代方法,这些方法在链接的问题中没有提到。 - Theraot
起点:*重命名文件夹中的一些文件* - Peter Mortensen
1个回答

103

替代方案

System.IO.File.Move

您可以使用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 都是等效的,它们对参数进行检查、权限检查和围绕kernel32MoveFile 的错误处理。

关于Microsoft.VisualBasic.FileIO.FileSystem.RenameFile,它将重命名给定全路径和新名称(类似于我上面介绍的用于构建目标路径),然后退回到kernel32MoveFile

以类似的方式,System.IO.FileInfo.MoveTo将调用来自kernel32MoveFile

注释2:还应该注意,您无法从Mono中找到Microsoft.VisualBasic。这意味着System.IO.File.MoveSystem.IO.FileInfo.MoveTo是唯一可移植的选项。


它都是MoveFile。

如上所述,所有这些方法都将退回到来自kernel32MoveFileMoveFile将适用于系统上挂载的任何驱动器(甚至网络驱动器),尽管不应将其用于从一个卷移动到另一个卷。 在这种情况下,需要将文件复制到目标并删除旧文件。


最佳替代方案

由于Microsoft.VisualBasic.FileSystem.RenameMicrosoft.VisualBasic.FileIO.FileSystem.RenameFile在其他操作系统中可能无法使用,因为它们没有被 Mono 移植,因此我将舍弃它们。

因此,我们只剩下System.IO.File.MoveSystem.IO.FileInfo.MoveTo。 在这两个之间,System.IO.File.Move的开销较小,因为它不必维护FileInfo对象的状态。 除此之外,它们将起同样的作用…因此,如果您已经使用了FileInfo,请使用System.IO.FileInfo.MoveTo,否则请使用System.IO.File.Move

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

庆祝!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接