3

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

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

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

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

通常我会将此归咎于图书馆,但它在桌面测试和只有一个进程访问文件时完美无缺。唯一似乎真正一致的是,当多个进程访问一个文件时,它可能会失败。

4

2 回答 2

2

有类似的问题,但没有分配时间来找到理想的解决方案。我创建了一个 web 服务并将文件粘贴到 web 服务应用程序的本地。然后创建了一个简单的单行 GET API,它通过办公室内部网调用。因此确保只有调用应用程序编辑了日志文件。虽然杂乱但功能正常。

于 2010-02-25T23:35:26.433 回答
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);
}
于 2010-02-26T03:14:47.967 回答