C# File.Move vs Rename - 它实际上是移动文件还是只是重命名?

C# File.Move vs Rename - Does it actually Move the file or just rename it?

阅读关于如何 "Rename" 文件的 Whosebug post 后,发现解决方案是使用 Files.Move 或 Directory.Move 方法。

我在 Windows 中知道,如果我进行重命名,它是即时的,因为我认为它并没有在驱动器上移动文件,而是在某处更改某些索引的位置。

当我使用 Files.Move 或 Directory.Move 时,它会做同样的事情,还是先复制然后删除?

我正在努力避免驱动器磨损。

When I use Files.Move or Directory.Move is it going to do the same thing

从技术上讲,它不会对文件做任何事情。它将对底层OS进行系统调用以执行移动操作。

所以从这个意义上说,是的,它会做同样的事情。当您指示 Windows 资源管理器 "move" 一个文件时,就像您总结的那样,它实际上只是在某处重新索引某些内容。 (该部分由 OS 使用的文件系统处理。)当您在 .NET 代码中执行这些功能时,在框架的某个更深层次上,它们实际上是在调用相同的 OS- Windows Explorer 执行的级别操作。

or is it going to do a Copy and then a Delete

我认为我从未见过以这种方式执行移动操作的文件系统。 (可能缺少一些新手或学生作为学术项目编写的。)如果确实存在,它不太可能被您可能遇到的任何操作系统普遍使用。

基本上,软件(无论是 Windows Explorer 还是 .NET Framework 中的代码)都会告诉 OS 执行操作。 OS 告诉文件系统执行操作。文件系统本身应该非常优化以执行此操作。

请参考File.Move使用的底层Win32API文档:

The MoveFile function will move (rename) either a file or a directory (including its children) either in the same directory or across directories. The one caveat is that the MoveFile function will fail on directory moves when the destination is on a different volume. If a file is moved across volumes, MoveFile does not move the security descriptor with the file. The file will be assigned the default security descriptor in the destination directory. The MoveFile function coordinates its operation with the link tracking service, so link sources can be tracked as they are moved.

关于您的问题:

Is it going to do a Copy and then a Delete?

唯一一次执行 "Copy" 然后执行 "Delete" 的情况是您将文件移动到不同的磁盘上。

在 Windows .NET Framework 的实施中,System.IO.File.Move calls the underlying Win32 function MoveFile

关于 MoveFile 的 MSDN:

Moves an existing file or a directory, including its children.

它似乎与 Windows Explorer 调用的函数相同。所以是的,它做同样的事情,只是重命名而不是 Copy/Delete.

public static void Move(String sourceFileName, String destFileName) {
    ...
    ... 
    if (!Win32Native.MoveFile(fullSourceFileName, fullDestFileName))
    {
        __Error.WinIOError();
    } 
}