如何正确地让多个进程读取同一个文件?

3

我有很多进程读取存储在网络共享上的文件。最初,我只能让一个进程读取该文件,其他所有进程都会抛出异常。我实现了以下代码来解决这个问题:

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

这个方法可以让多个进程读取同一个文件,但是有时候仍然会出现问题,因为有时候多个进程仍然无法访问文件。不过当文件没有被使用时,我稍后可以轻松打开它。目前,我已经实现了一些带随机延迟的重试行为,这似乎有所帮助。对我来说,这种做法有点古怪,那么有更好的方法吗?
奇怪的是,我得到的异常根本不是来自文件IO,而是来自一个名为CommStudio的库。简而言之,我将文件转储到字符串中,稍微修改一下,将其转储到内存流中,并通过rs232上的ymodem发送出去。异常告诉我远程系统已经取消了操作。接收数据的设备报告发生了传输错误,这通常意味着接收到了不完整/空的文件。
通常我会把责任归咎于库,但是在桌面测试和只有一个进程访问文件时,它运行得非常完美。唯一真正一致的事情似乎是,在多个进程访问文件时容易失败。

网络共享锁定可能很麻烦。你能告诉我你正在使用哪些网络共享(Windows版本,Unix?)以及你遇到了什么异常吗? - stmax
客户端使用XP系统,服务器是Windows Server,我认为是2008版,但不完全确定。我会发布一个关于异常的编辑。 - MGSoto
1
你总是读取同样的文件吗?你可以尝试在读取文件后计算校验和(例如参考SHA1类),以检查它们是否被正确读取。如果校验和正确,那么你就知道错误来自设备而不是从网络共享中读取。 - stmax
我有许多可以读取的文件,目前大约有50个左右,但通常传输都是批量进行的,因为客户往往会订购多个相同的设备,所以它们都需要传输相同的文件。我将研究校验和的想法,或者甚至只是将读取的文本转储到日志中,以查看它们是否匹配。 - MGSoto
2个回答

2

我曾遇到一个类似的问题,但时间不充裕,无法找到理想的解决方案。我创建了一个 Web 服务,并将该文件置于 Web 服务应用程序本地,然后创建了一个简单的一行式 GET API,在办公室 Intranet 上调用,从而确保只有调用应用程序可以编辑日志文件。虽然有些凌乱,但很实用。


有趣的解决方案。我有点喜欢它,但我不认为我会得到太多对这个解决方案的支持票数。然而,它确实给了我一个想法,因为我有一个主程序控制所有的进程,可能可以把文件发送到它们所需的进程中去......但最终也会运行多个这样的程序,我更倾向于选择一个保证性的解决方案。 - MGSoto

1

我过去也遇到了类似的问题。尝试更改访问文件的方式,例如像这样。

//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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接