让多个进程读取同一文件的正确方法?
我有许多进程正在读取存储在网络共享上的文件。最初我只能让一个进程读取该文件,所有其他进程都会抛出异常。我实现了以下代码来处理这个问题:
using (StreamReader fileStreamReader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
{
content = fileStreamReader.ReadToEnd();
}
这让多个进程读取同一个文件,但是它似乎仍然存在问题,因为有时多个进程仍然无法访问该文件。但我可以稍后在文件未使用时返回并打开它。现在我有一些重试行为,并实施了随机延迟,到目前为止,似乎有帮助。我觉得这样做有点奇怪,那么有什么更好的方法呢?
这是奇怪的部分,我得到的异常根本不是来自文件 IO,而是来自一个名为 CommStudio 的库。简而言之,我将文件转储到一个字符串,稍微修改它,将其转储到内存流中,然后通过 rs232 上的 ymodem 将其发送出去。例外情况是告诉我远程系统已取消。获取数据的设备报告存在传输错误,这通常意味着接收到不完整/空文件。
通常我会将此归咎于库,但它在桌面测试和只有一个进程访问文件时完美地工作。唯一看起来真正一致的是,当多个进程访问一个文件时,它很可能会失败。
I have many processes reading a file stored on a network share. Originally I was only able to have one process read the file, all the others would throw exceptions. I implemented the following code to deal with that:
using (StreamReader fileStreamReader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
{
content = fileStreamReader.ReadToEnd();
}
This let multiple processes read the same file, however it still seems to have issues, because sometimes multiple processes still can't access the file. Yet I can go back later when the file isn't in use and open it just fine. Right now I have some retry behavior with random delays implemented that so far, seem to help. It seems a little quirky to me to do it this way, so what would be a better method?
This is the weird part, the exception I'm getting is not from file IO at all, it's from a library called CommStudio. In short, I dump the file to a string, i modify it slightly, dump it into a memory stream, and ship it off over ymodem on rs232. The exception is telling me the remote system has canceled. The device getting the data reports that there was a transmission error, which usually means that an incomplete/empty file was received.
Normally I would blame the library on this, but it works flawlessly at desk-testing and when there is only one process accessing the file. The only thing that really seems to be consistent is that it is likely to fail when multiple processes are accessing a file.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
有类似的问题,但没有分配时间来找到理想的解决方案。我创建了一个 Web 服务并将文件粘贴到 Web 服务应用程序本地。然后创建了一个简单的单行 GET API,通过办公室内联网调用该 API。从而确保只有调用应用程序编辑了日志文件。虽然混乱但功能齐全。
had a similar problem but not allot of time to find an ideal solution. I created a webservice and stuck the file local to the webservice app.. then created a simple one liner GET API which was called over the office intranet.. thus ensureing only the calling application edited the log file.. messy but functional.
我过去也遇到过类似的问题。尝试将访问文件的方式更改为类似这样。
I have had a similar problem in the past. Try changing how you access the file to something like this.