2013-01-11 49 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会在文件发生更改时向我们发送通知。但是,在这一点之前,我们能否获得文件的内容? –