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

Jyi*_*ina 5 .net vb.net system.io.file

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

当我设置网格的 Row 和 Col 时,它会触发 RowColChange 事件。RowColChange 有一些代码可以使用 File.ReadAllBytes 打开同一个文件。我知道 ReadAllBytes 内部在 FileStream 上使用 using 因此文件流在使用后关闭。但是在告诉操作系统文件被释放时是否可能有一些延迟,因此 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
Run Code Online (Sandbox Code Playgroud)

Sni*_*ker 5

请尝试以下操作:

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

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

  • @VisualVincent是的,我知道没有很大的不同,但重要的区别是,这还允许另一个线程/程序在您阅读时进行写入(查看参考源:http://referencesource.microsoft.com /#mscorlib/system/io/streamreader.cs,fc51cfc8975d71a1) 我认为这可能会有所帮助,但你是对的,当他不写时,那是毫无用处的。 (3认同)
  • @VisualVincent,实际上,确实如此。如果打开另一个程序进行读/写(例如:Excel 打开 Excel 文件),并且您尝试使用 File.ReadAllBytes() 读取它,它将失败。但是,使用“FileShare.ReadWrite”打开它将会成功:它允许另一个程序打开该文件进行写入,并且仍然可以使用您的程序读取该文件。我使用它的目的正是:读取在 Excel 中打开的 Excel 文件,但这同样适用于许多其他应用程序。 (2认同)

Cee*_* it 5

基于这个答案以及结合File.ReadAllBytes使用该标志(参考)的事实,对同一文件的并发调用永远不会抛出“由另一个进程使用” ,除非另一个进程已经使用写锁打开它 -FileShare.ReadFileAccess.ReadFile.ReadAllBytesIOExceptionFileShare.Read拒绝写入因此会失败。

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

  1. 等待并重试。SO 上对这种方法有很好的报道,例如这个

  2. 打开 aFileStream并指定FileShare.ReadWrite详细信息请参见此处