System.IO.FileStream FileAccess vs FileShare

我已经搜遍过,但找不到这个问题的答案。 据我所知, FileAccess处理机器上的文件访问, FileShare处理共享,但我无法找到它是如何组合以及它们如何相互影响的解释。

例如,如果我有

using ( FileStream fs = new FileStream( pathName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) ) 

这是否意味着机器上的用户只能读取文件,而远程访问文件夹的用户可以读取和写入文件? 此外,使用会产生什么影响

 using ( FileStream fs = new FileStream( pathName, FileMode.Open, FileAccess.Read ) ) 

我还没有指定FileShare?

FileAccess说明你要对文件做什么。 很容易理解,你会知道你会读或写。

FileShare是一个非常棘手的问题,因为它要求你进入另一个程序员的行列。 它确定了另一个进程在打开文件时可以执行的操作。 访问文件的两个进程可能非常麻烦,您需要通过可能的故障模式进行推理。 您选择的值与文件类型和所需的访问密切相关。 按照你要做的事情来打破它:

FileAccess.Read

如果另一个进程也从文件中读取,则永远不会有任何问题。 所以FileShare.Read是默认选择。

如果另一个进程已经打开了要写入的文件,则可能需要FileShare.ReadWrite。 它已经获得了写访问权限,所以你永远不能用FileShare.Read自己打开文件,你不能拒绝写,因为其他进程是第一个,你将被拒绝访问。 这通常只对文本文件有好处,您可以确定其他进程只是将文本附加到文件末尾。 日志文件是非常常见的情况。 仍然可能很棘手,当该进程刷新文件的更改时,它确实很重要。 您可能会观察到部分书写的文本行,请注意这一点。

FileAccess.Write

您不能使用FileShare.Write或FileShare.ReadWrite。 由于这将允许两个进程同时写入文件,因此文件内容将是两个程序的混合输出。 一种可能的解决方法是这些进程仲裁对文件的访问,确保只有其中一个可以同时访问该文件。 通常由命名的互斥锁实现。

您可以使用FileShare.Read(如果它是文本文件),我在上面描述了与日志文件相同的场景。 否则,默认选择应为FileShare.None

FileAcces.ReadWrite

不常见,仅在您编写二进制数据并使用Seek()时使用。 在您执行此操作时,任何其他进程都无法正确读取文件,假设他们不自行仲裁访问,您必须使用FileShare.None。

FileShare与通过网络共享的驱动器无关 – 它指示其他进程如何访问该文件。

如果第一个进程使用FileShare.Read打开文件,则其他进程可以使用FileAccess.Read打开该文件,但在这种情况下,另一个进程无法使用FileAccess.Write打开该文件。

FileShare与Windows文件共享无关。 它讨论的是仅在同一台机器上共享文件。 它指定在您最大限度地完成之后其他文件处理的内容。 此外,将现有句柄与其进行比较,以决定是否可以打开文件。

FileAccess指定您的访问权限。