【问题标题】:File.ReadAllBytes throws IOException saying the process can't access the file because it is being used by another processFile.ReadAllBytes 抛出 IOException 说进程无法访问该文件,因为它正被另一个进程使用
【发布时间】:2017-03-14 19:15:59
【问题描述】:

File.ReadAllBytes 在两次调用之间没有足够的间隔时会导致 IOException 吗?

当我设置网格的 Row 和 Col 时,它会触发 RowColChange 事件。 RowColChange 有一些代码使用 File.ReadAllBytes 打开同一个文件。 我了解 ReadAllBytes 在内部使用 on FileStream ,因此文件流在使用后关闭。但是在告诉操作系统文件已释放时是否可能会有一些延迟 因此 File.ReadAllBytes 的后续使用可能会失败并引发异常。 有什么想法吗?谢谢!

grid.Row = 0
grid.Row = 1
grid.Col = 3


Private Sub grid_RowColChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles grid.RowColChange
    'Is it possible to get IOException saying the process can't access the file because it is being used by another process.
     Display(File.ReadAllBytes(filePath))
End Sub

【问题讨论】:

  • reference source 建议“否”:ReadAllBytes 使用FileShare.Read 打开文件,记录为“允许随后打开文件以供读取”。你确定没有并发写入吗?
  • 网上有很多关于如何做到这一点的例子以及stackoverflowstackoverflow.com/questions/35307459/…
  • @dlatikay,根本没有写入文件。感谢您阐明 ReadAllBytes 的用法。由于我没有证据表明该文件正在被另一个进程使用,因此我只是试图消除一些情况。
  • @dlatikay 尽管“//Do a blocking read”注释在 InternalReadAllBytes 中是什么意思?

标签: .net vb.net system.io.file


【解决方案1】:

请尝试以下方法:

Using fileStream = New FileStream("path", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    Using streamReader = New StreamReader(fileStream)
        Dim content = streamReader.ReadToEnd()
    End Using
End Using

实际上有可能两个线程在同一个文件中读取同一个文件,请尝试使用上面的代码读取文件。

【讨论】:

  • 这与使用File.ReadAllBytes 几乎相同。如果有什么东西完全锁定了文件,那么你就无法打开它。
  • @VisualVincent 是的,我知道没有太大的不同,但重要的区别是这也允许另一个线程/程序在您阅读时写入(查看参考源:@ 987654321@) 我认为这可能会有所帮助,但你是对的,当他不写的时候那是相当没用的。
  • 虽然File.ReadAllBytes() 已经指定了FileShare.Read(请参阅此问题的另一个答案),但我没有想到这一点,所以问题是其他东西完全锁定了文件。
  • @VisualVincent(我知道已经三年了),但最大的不同是上面的代码使用FileShare.ReadWrite(允许其他进程读写),而不是FileShare.Read(禁止其他进程来写)。这就是为什么这里的方法可以作为一种解决方法。
  • @VisualVincent,实际上,确实如此。如果打开另一个程序进行读/写(例如:Excel 打开一个 Excel 文件),并且您尝试使用 File.ReadAllBytes() 读取它,它将失败。但是,使用FileShare.ReadWrite 打开它会成功:它允许另一个程序打开文件以进行写入,并且仍然可以使用您的程序读取它。我使用它正是为了:读取在 Excel 中打开的 Excel 文件,但同样适用于许多其他应用程序。
【解决方案2】:

基于this answer 以及File.ReadAllBytes 结合FileAccess.Read (reference) 使用FileShare.Read 标志这一事实,在同一文件上并发调用File.ReadAllBytes 永远不会抛出“由另一个进程”IOException,除非另一个进程已经用写锁打开它 - FileShare.Read 拒绝写入,因此会失败。

如果您因为并发写入而看到异常,那么是的,您可以选择:

  1. 等待并重试。 SO上有关于这种方法的很好的报道,例如this one

  2. 打开FileStream 并指定FileShare.ReadWrite,如detailed here

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2021-12-02
    • 2013-07-31
    • 2010-12-10
    相关资源
    最近更新 更多