【问题标题】:System.IO.FileStream FileAccess vs FileShareSystem.IO.FileStream FileAccess 与 FileShare
【发布时间】:2014-09-25 16:37:30
【问题描述】:

我已经搜索了所有内容,但找不到这个问题的答案。我知道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 的地方?

【问题讨论】:

    标签: c# filestream


    【解决方案1】:

    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。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 所以让我试试看我能不能做到这一点。 FileShare 是我与其他孩子玩耍的方​​式,FileAccess 是我与自己玩耍的方式?换句话说,FileAccess 只处理我的应用程序?如果这是正确的,那么当我省略 FileShare 属性时会发生什么?
      • @Storm 基本上是对的。但是,FileAccess 不是针对您的应用程序,而是针对此 FileStream 实例。当涉及文件时,操作系统不会区分进程和线程。当您省略该属性时,您会得到一些没人记得的默认值。所以不要那样做。
      • MSDN 说:“FileShare.Read 是那些没有 FileShare 参数的 FileStream 构造函数的默认值。”
      • @Ben 请问你在哪里找到的?我刚刚重新检查了 FileStream 的 MSDN,但那里并没​​有说什么,我错过了什么?
      【解决方案3】:

      FileShare 与 Windows 文件共享无关。它只讨论在同一台机器上共享文件。它指定在您最大程度地执行之后会出现哪些其他文件句柄。此外,还会将现有句柄与其进行比较,以决定您是否可以打开文件。

      FileAccess 指定您的访问权限。

      【讨论】:

      • 这些答案非常接近,另一个只是对 FileAccess 有更多解释,所以我决定进一步扩展那个
      • 不仅是文件句柄在你之后。它也会根据已经打开的句柄进行检查。每当文件访问与另一个句柄文件共享发生冲突时,新打开的句柄就会丢失。
      猜你喜欢
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      相关资源
      最近更新 更多