我已经搜遍过,但找不到这个问题的答案.据我所知,FileAccess处理机器上的文件访问,FileShare处理共享,但我无法找到它是如何组合以及它们如何相互影响的解释.
例如,如果我有
using ( FileStream fs = new FileStream( pathName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) )
Run Code Online (Sandbox Code Playgroud)
这是否意味着机器上的用户只能读取文件,而远程访问该文件夹的用户可以读取和写入文件?此外,使用会产生什么影响
using ( FileStream fs = new FileStream( pathName, FileMode.Open, FileAccess.Read ) )
Run Code Online (Sandbox Code Playgroud)
我还没有指定FileShare?
Han*_*ant 34
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.