我正在尝试以一种不会锁定文件的方式读取以 xml 编写的许可证文件,以防应用程序碰巧同时检查。我根据 Shay Levy 和 Jb Evain
的这两个答案编写了以下代码我已经确认这能够从所需的文件中读取,并且能够访问和读取元素,但我想确认以这种方式读取文件是否不会导致任何文件锁定问题?
$FileStream = New-Object System.IO.FileStream $Path, 'Open', 'Read', 'ReadWrite'
$StreamReader = New-Object System.IO.StreamReader($FileStream)
$ReadFile = [xml] $StreamReader.ReadToEnd()
查看访问和共享模式兼容性表。它适用于 Win32 API,但也适用于 .NET,因为它向下调用 Win32
CreateFile
来访问文件系统。
在您的情况下,第三行适用(它包含格式错误,我已在下面修复):
第一次调用 CreateFile | 对 CreateFile 的第二次有效调用 |
---|---|
GENERIC_READ FILE_SHARE_READ FILE_SHARE_WRITE |
|
假设您的脚本首先打开文件,在这些情况下可能会发生文件锁定问题:
FILE_SHARE_WRITE
打开文件,它将失败(无论打开模式如何)。其他应用程序需要指定 FILE_SHARE_READ
或 FILE_SHARE_READ | FILE_SHARE_WRITE
才能成功打开文件。另一方面,如果该文件已被先由另一个应用程序打开,则在以下情况下您打开该文件的尝试将会失败:
FILE_SHARE_WRITE
打开文件。其他应用程序需要指定 FILE_SHARE_READ
或 FILE_SHARE_READ | FILE_SHARE_WRITE
才能让您的脚本随后成功打开文件。结论:
ReadWrite
是您在需要读取文件时确保最大兼容性的最佳选择。