代码之家  ›  专栏  ›  技术社区  ›  MGSoto

多个进程读取同一文件的正确方法?

  •  3
  • MGSoto  · 技术社区  · 16 年前

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

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

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

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

    通常情况下,我会将此归咎于库,但它在桌面测试以及只有一个进程访问文件时都能完美地工作。唯一看起来真正一致的是,当多个进程访问一个文件时,它可能会失败。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Sean.C    16 年前

    有一个类似的问题,但没有足够的时间来找到一个理想的解决方案。我创建了一个WebService,并将文件粘贴到WebService应用程序的本地。然后创建了一个简单的一行程序get api,通过Office内部网调用它。因此,确保只有调用应用程序编辑了日志文件。凌乱但实用。

        2
  •  0
  •   Firestrand    16 年前

    我过去也遇到过类似的问题。尝试将文件的访问方式更改为类似的方式。

    //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);
    }
    
    推荐文章