【问题标题】:C# multiple instances of program reading from same fileC#从同一个文件读取程序的多个实例
【发布时间】:2011-12-11 22:23:26
【问题描述】:

我写了一个程序,它从文件中读取,根据给定的参数处理它并写入一些输出。我很好奇,当用户创建我的程序的更多实例(通过打开可执行文件)并在同一个文件上运行它们时是否会出现任何奇怪的问题。

我使用 while 循环和 file.ReadLine() 从文件中读取。

【问题讨论】:

  • "writes some output" 是否意味着您正在阅读的文件中写入内容?
  • 不,文件名是根据用户的参数选择的。我不想读写同一个文件。我有一个非常大的文件,我想让我的程序的所有实例从中读取(但由于每个实例中的参数不同,以不同的方式处理它)并且我担心可能会发生意外行为:))跨度>

标签: c# file


【解决方案1】:

我很好奇,当用户创建我的程序的更多实例(通过打开可执行文件)并在同一个文件上运行它们时,是否会出现任何奇怪的问题。

这种措辞使我认为您担心用户可能会意外地针对同一个文件运行程序的多个实例。如果这是您关心的问题,那么您可以通过以独占模式打开文件来防止出现问题。只要文件处于打开状态,操作系统本身就会确保只有程序的单个实例可以访问该文件。

如果您使用 FileStream 对象访问文件,那么我相信独占模式是默认的,因此您完全不必担心这一点。只需确保您的流在所有需要一致性的读写操作中保持打开状态。

如果程序的另一个实例试图打开该文件,那么它将抛出 IOException 并且不允许访问。您可以让程序崩溃,也可以通知用户该文件已被使用,并让他们选择另一个文件,或其他任何方式。

更新

如果您想在程序的许多实例中从同一个文件中读取,而没有实例写入它,那么这也很容易实现。只需以共享只读模式打开文件,让很多程序同时读取文件完全没有问题。

using (Stream stream = new FileStream(filePath, FileMode.Open, 
                                      FileAccess.Read, FileShare.Read))

【讨论】:

  • 谢谢。实际上我希望它们(程序实例)同时读取该文件:)计算需要时间(小时),因此在同一个文件上运行更多具有不同参数的程序实例是有效的。我只是害怕这样做:)
【解决方案2】:

如果他们都在阅读,那么只有锁定文件才会有问题。使用FileAccess.ReadFileShare.Read 将允许他们同时打开它。

【讨论】:

  • 他们都打算写入文件,如问题中所述。
  • @Mr.失望,OP没有说输出会写在哪里
  • 这很公平,我通常不喜欢假设。 Otiel 已要求澄清。
  • 我也倾向于迂腐地避免假设,尽管在这种情况下,它确实像输出在其他地方一样读给我听。这肯定会导致更多的并发症。
  • 是的,每个实例都想从同一个文件中读取,但在其他地方写入:) 谢谢大家的帮助!
【解决方案3】:

如果您只是读取文件应该没有任何问题。

但是,如果您希望只有一个程序能够同时处理该文件,您可以使用 Mutex

例如:

Boolean isMyFileFree;
using (Mutex mutex = new Mutex(true, "Mutex4MyFile", out isMyFileFree)) {
    // Process your file
}

【讨论】:

  • 关于 Mutext 的注意事项:虽然使用 Mutext 实现了覆盖文件场景的“只有一个进程能够执行某些代码”,但它对于程序本身来说要复杂得多,并且不能防止其他进程读取相同的文件.具有正确共享标志的简单打开文件更适合这种情况。
【解决方案4】:

由于这两个实例都可能将数据写入文件,因此您非常危险:在读取和写入时都可能存在损坏的数据。

您应该做的是获得适当的权限/访问;例如,如果您使用File.Open 打开文件,则指定适用于当前执行模式的FileAccessFileShare

现在,由您来处理应用程序中的可访问性 - 当其中一个实例被“锁定”在文件之外时,有一个过程可以回退,以免中断(这与毫无疑问会破坏数据。)

如果您希望您的应用程序保持完整性,您的处理可能只是暂停一段时间并超时,然后重试;或者您可以删除冲突实例将要写入的更改。这取决于你的情况,但你有责任并且必须处理它。

【讨论】:

    【解决方案5】:

    如果您使用File.Open 并将FileShare.None 以外的其他内容传递给第四个share 参数,那么其他线程或进程可能会访问该文件。

    如果其他人只有Read 访问权限,这完全没有问题,除非您想删除文件。如果其他人具有更高级别的访问权限,那么您的代码应该处理其他可能性,例如文件被更改或删除。

    请注意,指定 FileShare.ReadWrite 会将访问权限扩展到所有有权归档的进程,而不仅仅是您知道的那些。

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2014-08-15
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多