- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我搜索了所有地方,但找不到这个问题的答案。我明白 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。
关于c# - System.IO.FileStream 文件访问与文件共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25097773/
我需要对同一文件进行一批写入,但在文件内的不同位置。我想以尽可能最好的性能实现这一目标,因此查看了同步 FileStream.Write 和异步 FileStream.BeginWrite 方法。 同
MSDN说FileStream.Flush(True) “还清除所有中间文件缓冲区。”。 “所有中间文件缓冲区”到底是什么意思? 最佳答案 它会将缓冲在文件系统缓存中的文件数据写入磁盘。该数据通常是根
考虑以下摘自 Microsoft docs 的代码: using FileStream createStream = File.Create(fileName); // ...write to str
我对Spark的理解fileStream()方法是将三种类型作为参数:Key , Value , 和 Format .对于文本文件,适当的类型是:LongWritable , Text , 和 Tex
为什么 FileStream.Length 是 long 类型,但 FileStream.Read 参数 - offset 有更短的长度 int 呢? 布莱恩 最佳答案 offset 参数告诉从哪里开
我编写了以下程序,其目的是创建一个给定大小的文件,其中包含一些随机数据。该程序运行良好,并完成了它应该做的事情。但是,我不明白为什么它会消耗 5GB 的 RAM(请参阅我的任务管理器的屏幕截图)。当我
我在一次采访中被问到这个问题,我说答案是 Managed。面试官似乎很惊讶。我的问题是即使它访问一个文件( native /非托管资源),但这个类不是托管的吗?或者你认为我应该有一些后续问题以获得更多
我正在编写一些代码作为打开文件框架的一部分。该文件属于自定义类型,不应由我的应用程序的多个实例打开。为了停止打开多个文件,我使用文件流创建一个锁定文件,然后保持所述文件流打开。 这似乎可以防止我的应用
我正在使用 Apache Commons Net 的 FTPClient 从位于服务器上的文件中读取内容。仅读取一次时效果很好。但是当我尝试读取第二个文件时,FTPClient 的 InputStre
问题 有没有办法在 C# 中创建带偏移量的 FileStream?例如,如果我在偏移量 100 处打开 SomeFile.bin,Stream.Position 将等于 0,但读取和写入将偏移 100
我正在阅读一个简单的文本文件,其中包含使用文件流类的单行。但似乎 filestream.read 在开头添加了一些垃圾字符。 代码下方。 using (var _fs = File.Open(_idF
我正在使用 FileStream 将 FTP 服务器的信息下载到我的 C:\驱动器上的目录中。出于某种原因,即使我什至尝试将目录权限设置为“所有人”访问权限,它也给了我这个异常(exception):
我正在尝试通过将文件作为参数的 API 上传 .srt 文件。 文件存储在服务器上,我正在使用 FileStream 和 StreamWriter 写入: string path = Server.M
我四处搜索了一下,但找不到能完美解决我的问题的东西。我有一些代码,即来 self 的数据库的 FileStream varbinary,并将其制作成客户端计算机上的文件,双击时可以在文件类型的默认应用
我最近在做一个涉及很多FileStreaming 的项目,这是我以前没有真正接触过的。 为了尝试更好地熟悉这些方法的原理,我编写了一些代码(理论上)将文件从一个 dir 下载到另一个,并逐步完成,在我
我通过例如下载文件5 个线程。当其中一个线程完成下载文件部分时 - 它被中止,但所有其余线程都有 ThreadState = WaitSleepJoin 并且显然停止下载。如何解决? while ((
我试图将 5 GB 的 ISO 文件复制到具有 29 GB 可用空间的 32 GB 闪存驱动器上。 Windows 7 拒绝让我拖放文件到闪存驱动器,报告文件对于目标文件系统来说太大了。 我最终了解到
我发现将 BufferedStream 与 FileStream 结合使用没有意义,因为它有自己的缓冲策略。然而,我想知道一件事: FileStream fsWithBuffer = new File
我有一个只读的 FileStream,它是一个方法局部变量: public void SomeMethod() { var fileStream = File.Open(fileName, Fi
我有两个文件流,它们从不同的文件中收集不同的信息: FileStream dataStruc = new FileStream("c:\\temp\\dataStruc.txt", FileMode.
我是一名优秀的程序员,十分优秀!