System.IO.FileStream FileAccess vs FileShare

时间:2014-08-02 17:44:18

标签: c# filestream

我已经搜遍了所有但未找到这个问题的答案。我了解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?

3 个答案:

答案 0 :(得分:32)

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。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

FileAccess指定您的访问权限。