StreamReader 在不锁定文件的情况下读取整个文件的正确方法?

问题描述 投票:0回答:1

我正在尝试以一种不会锁定文件的方式读取以 xml 编写的许可证文件,以防应用程序碰巧同时检查。我根据 Shay LevyJb Evain

的这两个答案编写了以下代码

我已经确认这能够从所需的文件中读取,并且能够访问和读取元素,但我想确认以这种方式读取文件是否不会导致任何文件锁定问题?

$FileStream = New-Object System.IO.FileStream $Path, 'Open', 'Read', 'ReadWrite'
$StreamReader = New-Object System.IO.StreamReader($FileStream)

$ReadFile = [xml] $StreamReader.ReadToEnd()
.net powershell streamreader
1个回答
0
投票

查看访问和共享模式兼容性表。它适用于 Win32 API,但也适用于 .NET,因为它向下调用 Win32

CreateFile
来访问文件系统。

在您的情况下,第三行适用(它包含格式错误,我已在下面修复):

第一次调用 CreateFile 对 CreateFile 的第二次有效调用
GENERIC_READ
FILE_SHARE_READ
FILE_SHARE_WRITE
  • GENERIC_READ、FILE_SHARE_READ
  • GENERIC_READ、FILE_SHARE_READ、FILE_SHARE_WRITE
  • GENERIC_WRITE、FILE_SHARE_READ
  • GENERIC_WRITE、FILE_SHARE_READ、FILE_SHARE_WRITE
  • GENERIC_READ、GENERIC_WRITE、FILE_SHARE _READ
  • GENERIC_READ、GENERIC_WRITE、FILE_SHARE_READ、FILE_SHARE_WRITE

假设您的脚本首先打开文件,在这些情况下可能会发生文件锁定问题:

  • 如果另一个应用程序尝试打开该文件而不指定any共享模式标志,它将失败。
  • 如果另一个应用程序尝试仅使用
    FILE_SHARE_WRITE
    打开文件,它将失败(无论打开模式如何)。其他应用程序需要指定
    FILE_SHARE_READ
    FILE_SHARE_READ | FILE_SHARE_WRITE
    才能成功打开文件。

另一方面,如果该文件已被先由另一个应用程序打开,则在以下情况下您打开该文件的尝试将会失败:

  • 其他应用程序未指定any共享模式标志。
  • 其他应用程序仅使用
    FILE_SHARE_WRITE
    打开文件。其他应用程序需要指定
    FILE_SHARE_READ
    FILE_SHARE_READ | FILE_SHARE_WRITE
    才能让您的脚本随后成功打开文件。

结论:

  • 指定文件共享模式
    ReadWrite
    是您在需要读取文件时确保最大兼容性的最佳选择。
© www.soinside.com 2019 - 2024. All rights reserved.