2013-01-11 46 views
3

我有一個過程,我正在將字節數組寫入文件(StorageFile)。該過程定期運行,同時需要在另一個進程中從文件的開頭讀取。這兩個過程在不同的類中。當我開始讀取文件時,寫入操作失敗,出現拒絕訪問錯誤。windows 8 C#同時讀取和寫入文件

這裏的文件是一個StorageFile內的應用程序文件夾。

寫方法調用:

IRandomAccessStream randomStream = await targetFile.OpenAsync(FileAccessMode.ReadWrite); 
Stream stream = randomStream.AsStreamForWrite(); 

讀取方法調用:

IRandomAccessStream randomStream = await targetFile.OpenAsync(FileAccessMode.Read); 
Stream stream = randomStream.AsStreamForRead(); 

這兩種操作從不同的方法發生同時,它導致訪問被拒絕的錯誤。似乎我可以使用相同的方法內的讀/寫,同時打開寫入。 但如何從不同的方法做到這一點?

我們有沒有類似於之前的System.IO.FileShare,所以我可以明確地說這個文件需要從同一個應用中的另一個位置訪問?

+1

如果這只是方法,請使用鎖定。有了這個,你可以相互排除 – Offler

+0

寫入時,我追加到流的末尾。我不是每次都打開文件,每次寫入大量數據並關閉文件。這可能是不可能的,因爲這兩個操作的讀寫需要不斷髮生... –

+2

使用真正的數據庫,win8現代應用程序支持SQLite,http://wp.qmatteoq.com/using-sqlite-in -your-windows-8-metro-style-applications/ –

回答

0

除了切換到數據庫類型設置,我建議將寫入緩衝到數組,並根據緩衝區填充和/或一定的時間過去將它們寫入數據塊。除非您需要毫秒級的最新和最佳性能,否則我懷疑有人會注意到性能影響。您必須使用緩衝區大小來確保給讀者足夠的時間來實際讀取文件。

在閱讀器方面,您可以在文件上實現一個FileSystemWatcher對象。

+0

對不起,似乎我無法趕上整個想法... –

+0

對不起,似乎我無法趕上整個想法......你是建議創建一個數組,並將整個內容寫入數組,以便我可以閱讀從數組開始?如果是這樣,我認爲它不會工作,因爲文件大小可能會更大(有時甚至大約100 MB)。如果想法是使用array作爲過程可以讀取的大塊數據的佔位符,那麼我就不清楚了......從文件讀取是最終用戶主動行爲,所以當最終用戶啓動時讀取最初的1MB,文件可能包含25MB或更多。我如何將它們放入數組中。 –

+0

FileSystemWatcher會在文件發生更改時向我們發送通知。但是,在這一點之前,我們能否獲得文件的內容? –