2016-08-03 86 views
-1

我想同時寫入和讀取二進制文件,但每當我嘗試這樣做時,我總是會得到一個異常,指出該文件已被其他進程使用。我知道如何使用正常的FileStream來做到這一點,但是BinaryReaderBinaryWriter不起作用。同時讀取和寫入二進制文件

有沒有人有一個想法如何讀取和寫入二進制文件同時?

什麼我迄今所做的:

FileSt = New FileStream("file.bin", FileMode.Create,FileAccess.ReadWrite) 
writer = New BinaryWriter(FileSt, enc) 
reader = New BinaryReader(File.Open("file.bin", FileMode.Open)) 
+1

除了提供的答案之外,如果打算打開同一文件兩次 - 一次用於讀取,一次用於寫入 - 那麼您應該使用'FileAccess.Read'作爲一個文件,另一個文件'FileAccess.Write'。此外,不要使用'FileStream'構造函數打開一次文件,也不要使用'File.Open'打開一次文件。保持一致並且兩次使用相同的方法。另外,使用'Using'塊打開文件,以便在完成後隱式關閉它。 – jmcilhinney

回答

0

你打開文件兩次 - 一次是閱讀,一次是寫作。這意味着一個FileStream需要FileAccess.ReadFileShare.Write,而另一個需要FileAccess.WriteFileShare.Read。此代碼測試,並與那些已經有一個Integer,並寫入到其與BinaryWriter一個String文件驗證:

Dim filePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Test.bin") 

Using source = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Write), 
     destination = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read), 
     reader As New BinaryReader(source), 
     writer As New BinaryWriter(destination) 
    Dim n = reader.ReadInt32() 

    writer.Write(98765) 
    writer.Write("What's up doc?") 

    Dim sz = reader.ReadString() 
End Using 

請注意,您應該只指定ReadWrite如果這是所有的需要。如果您知道您會或可能需要兩者,請只指定ReadWriteFileAccess值是用於此FileStream將對文件執行或可能執行的操作,而FileShare值用於允許在同一文件上打開的其他FileStream對象執行的操作。

2

您需要使用FileStreamconstructor overload可以提供FileShare模式。

看看MSDN指出約FileShare.ReadWrite模式:

允許讀取或寫入該文件隨後打開。如果未指定此 標誌,則在文件 關閉之前,打開文件讀取或寫入(通過此進程或其他進程)的任何請求都將失敗。但是,即使指定了此標誌,訪問該文件仍需要額外的 權限。

+0

Fidemraizer:即使與FileShare.ReadWrite我得到相同的錯誤 – Eggord

+0

@Eggord我懷疑它。實際上你用不同的標誌打開整個文件兩次。嘗試用'FileShare.ReadWrite'打開兩者,看看會發生什麼 –

0

您需要在文件上設置文件共享模式。

 FileStream blah = new FileStream("file.bin", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); 
+0

我試過了你的代碼,但是我仍然得到一個錯誤。 – Eggord

+0

正如其他人所指出的,您還需要更改第二次打開: \t \t FileStream binaryReaderFile = File.Open(「file.bin」,FileMode.Open,FileAccess.Read,FileShare.ReadWrite); – BertZ