C#从同一文件读取程序的多个实例

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

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

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

这个措辞的方式让我觉得你担心用户可能会意外地针对同一个文件运行该程序的多个实例。 如果这是您的问题,那么您可以通过以独占模式打开文件来防止此问题。 只要您保持文件打开,操作系统本身就会确保只有程序的单个实例才能访问该文件。

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

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

UPDATE

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

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

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

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

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

例如:

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

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

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

现在,您可以自行处理应用程序中的可访问性 – 当其中一个实例被“锁定”到文件中时,有一个可以回退的过程,以免中断(这会像破坏数据一样糟糕) , 毫无疑问。)

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

如果您使用File.Open并将FileShare.None以外的其他内容传递给第4个共享参数,则其他线程或进程可以访问该文件。

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

请注意,指定FileShare.ReadWrite扩展对所有具有文件权限的进程的访问权限,而不仅仅是您知道的权限。