File.WriteAllText和Concurrent Accesses

假设我正在使用File.WriteAllText将非常长的字符串写入文件,而另一个线程或进程正在尝试读取同一个文件。 会抛出任何exception吗? 换句话说,File.WriteAllText方法使用的FileShare参数是什么? 它没有写在文档中!

这是.net Framework 4.0的源代码。 显然,StreamWriter用于内部使用FileShare.Read。

  [SecuritySafeCritical] public static void WriteAllText(string path, string contents) { if (path == null) { throw new ArgumentNullException("path"); } if (path.Length == 0) { throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath")); } InternalWriteAllText(path, contents, StreamWriter.UTF8NoBOM); } private static void InternalWriteAllText(string path, string contents, Encoding encoding) { using (StreamWriter writer = new StreamWriter(path, false, encoding)) { writer.Write(contents); } } 

这是为StreamWriter创建基础流的代码。

 private static Stream CreateFile(string path, bool append) { return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan); } 

MSDN不记录使用的共享模式。

您可以查看源代码(已发布或通过反汇编程序),或在运行时查看该选项(例如,使用Process Monitor ,然后将WIn32 API标志转换为FileShare值)。

由于没有记录,补丁或新版本可能会改变它。

或者,如果重要的是使用FileStream重载之一自己打开文件,该过载采用FileShare参数,打开StreamWriter ,然后写入文本。

会抛出任何exception吗?

是。 如果文件已经打开并且具有不兼容的共享模式,则打开将失败。

会抛出任何exception吗?

是。 您应确保在一个进程写入文件时,其他人不使用lock读取它。 即使您将FileShare参数设置为Read ,例如允许随后打开文件进行读取而不立即抛出exception也不是一个好主意,因为这些读者可能会得到损坏的结果。