取决于文件如何打开!

取决于文件如何打开!

从维基百科得知,robocopy 将跳过复制处于打开状态的文件。

但是,在测试 robocopy 行为时,robocopy 仍然会复制 Windows 中最简单的文本编辑器打开的文件。为什么?

答案1

首先,正如 @fejyesynb 正确指出的那样,记事本不会保留活动文件句柄 - 它会打开文件,快速读取(或写入)数据,然后再次关闭文件。数据在屏幕上,但文件实际上一直处于关闭状态。

其次,Windows 继承了 MS-DOS 的“共享模式”概念,将其作为文件锁定的一种简单形式。打开文件时,您可以选择是否共享该文件以供读写、仅供读取或根本不共享。

例如,如果您的程序(robocopy)想要打开文件进行读取(FileAccess.Read),它将仅有的如果所有现有文件句柄都允许“读取”共享模式(或者根本没有打开文件句柄),则成功。但如果文件是用“不共享”打开的,那么如果你尝试打开它,你将得到“文件正在使用”任何目的。

您可以在 PowerShell 中执行此操作,通过调用低级 .NET系统.IO.文件.打开()功能:

$fh = [System.IO.File]::Open($path,
                             [System.IO.FileMode]::Open,
                             [System.IO.FileAccess]::Read,
                             [System.IO.FileShare]::None)

第四个参数可以是任意的System.IO.FileShare 枚举值,例如:

  • [System.IO.FileShare]::None– 不分享任何内容
  • [System.IO.FileShare]::Read– 共享读取(阻止写入/删除)
  • [System.IO.FileShare]::ReadWrite– 共享读/写(阻止删除)

完成后:

$fh.Close()

答案2

因为您正在思考“开放”的不同含义。

记事本(以及我知道的所有其他文本编辑器)会打开一个文件进行阅读,然后您会在屏幕上看到它。然后它关闭该文件时您仍然可以看到其内容(现在在 RAM 中)。

例如,如果您有fd = open("file.txt", FLAGS);并且它尚未被关闭close(fd),那么它将不会被 robocopy 复制。

答案3

取决于文件如何打开!

许多应用将整个文件加载到内存并关闭因此实际上文件未被使用。这当然不能用于大文件,因此大型文本文件的编辑器有各种技术来提高工作效率,比如一次只将文件的一部分加载到内存中

许多其他人确实保持文件句柄打开,但他们不要锁定文件,允许其他应用程序读取/复制该文件

记事本将文件映射到内存,导致文件不看起来像被打开了。这意味着 fejyesynb 所说的是不正确的,因为它根本没有将文件加载到 RAM

欲了解更多信息,您可以阅读

相关内容