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

Posted

技术标签:

【中文标题】如何在 .NET 中重命名文件?【英文标题】:How to rename a file in .NET? 【发布时间】:2013-10-09 15:05:06 【问题描述】:

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

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

如果使用System.IO.FileMove 是不是最好的方式?

【问题讨论】:

一篇讨论你要做的事情的文章是 How can I rename a file in C#? 在 Stack Overflow 推出 5 年后,这怎么能不重复? @PeterMortensen 最接近的匹配:Rename a file in C#。尽管在这种情况下,CJ7 知道该方法 (System.IO.File),但在我阅读时,问题是是否有更好的选项可以跨不同的驱动器和网络位置工作。如果提到的 API 在这些情况下有效,我还没有找到明确的声明(我的直觉是它确实有效)......但值得一提的是链接问题中未提及的在 .NET 中重命名和移动文件 avalialbe 的一些替代方法。 起点:Rename some files in a folder 其他:Rename a file in C# (NET 2.0) without moving it or using DOS / Visual Basic commands 【参考方案1】:

替代方案

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);

注意:也可以如上图构建目标路径。


“手部移动”

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

您可以在 How to write contents of one file to another file? 接受的解决方案中看到一个示例。


注意事项

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

Microsoft.VisualBasic.FileSystem.RenameSystem.IO.File.Move 是等价的,它们从kernel32 围绕MoveFile 进行参数检查、权限检查和错误处理。

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

System.IO.FileInfo.MoveTo 以类似的方式从kernel32 调用MoveFile

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


都是 MoveFile。

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


最好的选择

由于 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)。

庆祝!

【讨论】:

以上是关于如何在 .NET 中重命名文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中重命名文件

如何在上传过程中重命名图像文件

如何在 JGit 中重命名文件

如何在 HIVE 的分区中重命名文件

markdown 如何在Mac OSX中重命名文件?

如何在 Laravel 8 中重命名 .env 文件