从维基百科得知,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 复制。