为什么robocopy仍然复制一个打开的文件,在windows中由txt编辑器打开

Ken*_*Ken 4 notepad file-transfer batch command-line robocopy

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

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

use*_*686 5

首先,正如@fejyesynb 正确指出的那样,记事本不保留活动的文件句柄——它打开文件,快速读取(或写入)数据,然后再次关闭文件。该数据在屏幕上,但该文件实际上被关闭的全部时间。

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

例如,如果您的程序 (robocopy) 想要打开文件进行读取 (FileAccess.Read),则只有当所有现有文件句柄都允许“读取”共享模式时(或者如果没有任何打开的文件句柄在全部)。但是如果文件是用“share none”打开的,那么如果您出于任何目的尝试打开它,您将得到“File in use” 。

您可以在 PowerShell 中通过调用低级 .NET System.IO.File.Open()函数来执行此操作:

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

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

  • [System.IO.FileShare]::None – 什么都不分享
  • [System.IO.FileShare]::Read – 共享读取(块写入/删除)
  • [System.IO.FileShare]::ReadWrite – 共享读/写(块删除)

完成后:

$fh.Close()
Run Code Online (Sandbox Code Playgroud)