2010-02-25 212 views
3

我有很多进程读取存储在网络共享上的文件。最初我只能有一个进程读取文件,其他所有人都会抛出异常。我执行下面的代码来处理是:有多个进程读取同一文件的正确方法?

using (StreamReader fileStreamReader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) 
{ 
    content = fileStreamReader.ReadToEnd(); 
} 

这让多个进程读取同一个文件,但它似乎仍然有问题,因为有时候多个进程仍然无法访问该文件。然而,我可以稍后再回来,当文件没有被使用,并打开它就好了。现在我有一些重试行为,实施了迄今为止的随机延迟,似乎有所帮助。这样做对我来说似乎有点古怪,那么更好的方法是什么?

这是奇怪的部分,我得到的异常根本不是来自文件IO,而是来自名为CommStudio的库。总之,我将文件转储到一个字符串,我稍微修改它,将其转储到内存流中,然后通过rs232上的ymodem将其发送出去。例外是告诉我远程系统已经取消。获取数据的设备报告存在传输错误,这通常意味着收到了不完整/空文件。

通常我会责怪图书馆这个,但它在桌面测试和当只有一个进程访问文件时完美地工作。唯一真正似乎一致的是,当多个进程访问文件时,它很可能会失败。

+0

锁定网络共享可以是皮塔饼。你能告诉你正在使用哪些网络共享(windows版本,unix?)以及你得到了什么异常? – stmax 2010-02-25 23:24:55

+0

客户端使用的是XP,服务器是Windows Server,我认为是2008,但并不完全确定。我发布了关于异常的编辑。 – MGSoto 2010-02-25 23:30:56

+1

你总是阅读相同的文件吗?您可以尝试在读取文件后检查是否正确读取校验和(请参见类SHA1)。如果校验和正确,则知道错误来自设备,而不是从网络共享中读取。 – stmax 2010-02-25 23:49:45

回答

2

有一个类似的问题,但没有时间寻找理想的解决方案。我创建了一个web服务,并将该文件粘贴到webservice应用程序的本地文件中,然后创建了一个简单的单行GET API,它通过Office Intranet被调用,从而确保只有调用应用程序编辑日志文件..凌乱但功能。

+0

有趣的解决方案。我有点喜欢它,但我不认为我会得到太多的选票,解决方案。然而,它确实给了我一个想法,因为我确实有一个控制所有进程的主程序,并且可能为进程提供他们需要的文件......但是最终还会有多个运行的进程,我宁愿去一个有保证的解决方案。 – MGSoto 2010-02-25 23:39:40

0

我以前有类似的问题。尝试改变你如何访问这个文件。

//Use FileInfo to get around OS locking of the file 
FileInfo fileInfo = new FileInfo(path); 
//I actually wanted unblocked read write access so change your access and share appropriately 
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.ReadWrite)) 
{ 
    //I'm using CopyTo but use whatever method matches your need 
    fileInfo.CopyTo(Path.Combine(destination, fileName), false); 
} 
相关问题