Windows或Linux如何解析文件重命名/移动/复制

时间:2018-11-19 09:33:25

标签: java linux powershell nio apache-commons

我想知道linux和windows如何解决文件重命名或文件移动(拖放)的底层问题吗? 在Java中,我们有File.move,但我不知道它是如何工作的?

在阿帕奇地区,我们有FileUtils.moveFile

在Linux和Windows中,“移动文件”是什么意思?系统在移动/重命名文件时是否将文件放入内存文件,然后创建新文件并删除旧文件?

1 个答案:

答案 0 :(得分:0)

复制和重命名是不同的操作。

  • 复制产生一个新文件。通过复制字节 1 来完成;例如打开文件并使用读/写syscall来复制字节。
  • 重命名可更改现有文件的路径名。这是通过更改文件元数据以及源目录和目标目录的系统调用完成的。

有一些皱纹。

  • 重命名(在Linux上)仅在文件系统内有效。您不能将文件重命名为其他文件系统中的路径名。

  • 在Linux / POSIX库中没有“移动”系统调用。因此,例如,Linux上的mv命令将根据源和目标的位置来重命名文件或进行复制(并删除原始文件)。

  • 使用写入时复制,可以惰性的方式复制文件 。例如,“ btrfs”支持写时复制,并且该功能可能会公开给应用程序。

在Java应用程序中,复制是通过复制文件的字节来实现的,重命名是通过调用OS提供的重命名syscall来实现的(请参见上文)。移动动词通常是复制和移动的混合体。

那是简单的版本。在实践中,性能还取决于文件系统元数据的组织和存储方式,以及操作系统用来加快处理速度的各种“技巧”。例如使用“元数据事务日志”将元数据和文件数据缓存在内存中,进行预读/后写,以加快元数据操作。还有一些基于硬件的调整技巧,例如将元数据放到存储介质中,每秒的IOP比数据高。 (如果要处理具有数千万个文件的文件系统,这是特别必要的...)


1-实际上,打开文件并创建一个新文件都涉及读取和写入元数据,但是每个文件复制一次。相反,如果要复制文件,则通常必须写入(并可能读取)该文件的所有磁盘块。对于大文件,读写操作将主导元数据操作。