我编写了一个从文件读取的程序,根据给定的参数处理它并写入一些输出。我很好奇,如果用户创建了我的程序的更多实例(通过打开可执行文件)并在同一个文件上运行它们会发生任何奇怪的问题。
我使用while循环和file.ReadLine()
读取文件。
答案 0 :(得分:5)
我很好奇,如果用户创建了我的程序的更多实例(通过打开可执行文件)并在同一个文件上运行它们,就会出现任何奇怪的问题。
这个措辞的方式让我觉得你担心用户可能会意外地针对同一个文件运行多个程序实例。如果您担心这一点,那么您可以通过以独占模式打开文件来防止此问题。只要您保持文件打开,操作系统本身就会确保只有程序的单个实例才能访问该文件。
如果您使用FileStream对象访问该文件,那么我相信独占模式是默认模式,因此您根本不必担心这一点。只需确保您的流在所有读取和写入中保持打开状态,以确保一致性。
如果程序的另一个实例试图打开该文件,那么它将抛出IOException并且不允许访问。您可以让程序崩溃,也可以通知用户该文件已被使用,并为他们提供选择其他文件的选项。
<强>更新强>
如果你想在程序的许多实例中读取同一个文件,没有实例写入,那么这也很容易实现。只需以共享只读模式打开文件,完全没有问题让许多程序同时读取文件。
using (Stream stream = new FileStream(filePath, FileMode.Open,
FileAccess.Read, FileShare.Read))
答案 1 :(得分:0)
如果您只是从文件中读取,那么应该没有任何问题。
但是,如果您希望只有一个程序能够同时处理该文件,则可以使用Mutex
。
例如:
Boolean isMyFileFree;
using (Mutex mutex = new Mutex(true, "Mutex4MyFile", out isMyFileFree)) {
// Process your file
}
答案 2 :(得分:0)
如果他们都在阅读,那么只有锁定文件才会出现问题。使用FileAccess.Read
和FileShare.Read
将允许他们同时打开它。
答案 3 :(得分:0)
由于两个实例都可能将数据写入文件,因此您处于危险之中:在读取和写入时,可能存在损坏的数据。
您应该做的是获得适当的权限/访问权限;例如,如果您使用File.Open
打开文件,请指定适用于当前执行模式的FileAccess
和FileShare
。
现在,您可以自行处理应用程序中的辅助功能 - 当其中一个实例被“锁定”到文件中时,可以使用其中一个课程,以免中断(这会像毫无疑问,破坏了数据。)
如果您希望应用程序保持完整性,您的处理可能只是暂停一段时间并暂停,并重试;或者您可以删除冲突实例将要写入的更改。这取决于您的情况,但您有责任并且必须处理它。
答案 4 :(得分:0)
如果您使用File.Open
并将FileShare.None
以外的其他内容传递到第4个共享参数,则其他线程或进程可以访问该文件。
如果其他人只有Read
访问权限,那么除了您要删除文件之外,这将完全没有问题。如果其他人具有更高级别的访问权限,那么您的代码应该处理其他可能性,例如被更改或删除的文件。
请注意,指定FileShare.ReadWrite
会扩展对所有具有文件权限的进程的访问权限,而不仅仅是您知道的权限。