c#file.move vs Rename-它实际上是移动文件还是将其重命名



阅读了有关如何"重命名"文件的stackoverflow帖子后,解决方案原来是使用files.move或directory.move.move方法。

我在Windows中知道,如果我重命名它是瞬时的,因为我认为它并不是在驱动器上移动文件,而是在更改某个索引的位置。

当我使用files.move或directory.move时,它要做同样的事情,还是要进行副本然后删除?

我试图避免驱动器上的磨损。

请参阅File.Move使用的基础Win32 API的文档:

MoveFile功能将移动( Rename )文件或目录 (包括其孩子)在同一目录中或跨越 目录。一个警告是MoveFile功能将失败 目录在目的地在不同卷时移动。如果一个 文件在卷上移动,movefile不会移动安全性 文件的描述符。该文件将分配默认值 目标目录中的安全描述符。Movefile 功能通过链接跟踪服务协调其操作,因此 链接源可以在移动时跟踪。

关于您的问题:

它要进行副本然后删除?

唯一进行"复制"然后"删除"的时间是,如果您将文件移到单独的磁盘上。

当我使用files.move或directory.move时,它要做同样的事情

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

因此,从某种意义上说,是的,它将做同样的事情。当您指示Windows Explorer"移动"文件时,如您总结时,有效地将某些内容重新索引。(该部分由OS使用的文件系统处理。)当您在.NET代码中执行这些函数时,在框架中更深入的某个级别上,它们基本上调用了Windows Explorer所做的相同的OS级操作。<<<<<<<<<<<<

还是要进行副本,然后删除

我认为我从未见过以这种方式执行移动操作的文件系统。(也许是一个新手或学生作为一个学术项目所写的。)如果确实存在,那么您可能会遇到的任何操作系统通常都可以使用它。

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

在.NET框架的Windows插入中

MSDN关于MoveFile:

移动现有文件或目录,包括其子女。

似乎与Windows Explorer调用的功能相同。是的,它做同样的事情,只是重命名而不是副本/删除。

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

最新更新