【问题标题】:how can my .NET app prevent other processes from writing to a file while my app reads it?我的 .NET 应用程序如何在我的应用程序读取文件时阻止其他进程写入文件?
【发布时间】:2019-01-11 15:47:32
【问题描述】:

我希望我的 .NET 应用程序读取由 Julia 应用程序写入的文件。在阅读它时,我希望我的应用程序以某种方式锁定文件,以便 .NET 正在读取它时 Julia 进程无法写入它。

只有 Julia 进程才会写入此文件。
只有我的 .NET 应用程序会读取此文件。

这是怎么做到的?

我想使用:
System.IO.File.Copy(source_filename,destin_filename)

【问题讨论】:

  • 你确定这个“Julia”进程可以处理文件被锁定写的事实吗?
  • 不确定这是否有帮助,但值得检查link
  • 朱莉娅是谁?你能和她谈谈,说服她有一些 IPC 或 API 来满足你的需要吗?你可以尝试以独占方式打开文件(假设 Julia 会在写入后立即释放它),但是你的阅读可能会导致 Julia 崩溃。
  • @Sinatr julialang.org
  • @stuartd,谢谢,完全错过了标签,并认为它是另一个程序员的名字。

标签: c# .net julia


【解决方案1】:

所有现代文件系统都像数据库一样工作。因此他们有锁和交易。 NTFS 就是一个很好的例子。

除了读取锁(或只是读取锁)之外,您还想获得文件上的写入锁。然后只使用读取的。 可以有多个读锁,但任何给定文件上只有一个写锁。在某些情况下,任何拥有写锁的人甚至可以排除其他任何获得读锁的人(反之亦然)——在读取过程中避免文件不一致可能是必要的。但这涉及到深入的实现细节。

当然,现在的问题是 other 程序将如何处理锁定文件的其他人。从技术上讲,您应该像处理任何其他 Exogenous exception 一样处理它,但我是第一个承认在某些情况下我可能跳过了该代码(以及重试代码)的人。或多任务处理,以优雅地处理较长的锁定获取时间。

在任何一种情况下,最好尽快释放您的锁。为此,建议将整个文件快速读入内存,然后处理内存副本。如何在 .NET 中解决这个问题在很大程度上取决于文件大小。 x32 内存限制和对象限制因妨碍 GiB 范围内的文件而臭名昭著。

【讨论】:

    【解决方案2】:

    我认为在这种情况下要走的路是有一个 .net 线程来检测来自 Julia 的新文件的存在,然后立即将其移动到不同的独占路径,在那里读取和删除它。 Julia 应用程序仅每 5 秒写入一次文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 2011-10-05
      • 2012-01-31
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多