File.ReadAllBytes抛出IOException,说该进程无法访问该文件,因为它正被另一个进程使用

时间:2017-03-14 19:15:59

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

如果在调用之间没有足够的间隔调用两次FileReadAllBytes会导致IOException吗?

当我设置网格的Row和Col时,它会触发RowColChange事件。 RowColChange有一些代码,它使用File.ReadAllBytes打开同一个文件。 据我所知,ReadAllBytes在内部使用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

2 个答案:

答案 0 :(得分:2)

请尝试以下方法:

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

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

答案 1 :(得分:1)

this answer的基础上以及File.ReadAllBytesFileShare.Read标记与FileAccess.Readreference)结合使用的事实,对{{1}的并发调用在同一个文件上永远不会抛出“由另一个进程使用”File.ReadAllBytes,除非另一个进程已经使用写锁定打开它 - IOException拒绝写入,因此会失败。

如果由于并发写入而看到异常,那么是的,您有选项:

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

  2. 打开FileShare.Read并指定FileStreamdetailed here