假设我正在使用File.WriteAllText将非常长的字符串写入文件,而另一个线程或进程正在尝试读取同一个文件。会抛出任何异常吗?换句话说,File.WriteAllText方法使用的FileShare参数是什么?它没有写在文档中!
答案 0 :(得分:9)
这是.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);
}
答案 1 :(得分:5)
MSDN未记录使用的共享模式。
您可以查看源代码(已发布或通过反汇编程序),或在运行时查看该选项(例如,使用Process Monitor,然后将WIn32 API标记转换为FileShare
值)
但因为未记录补丁或新版本可能会改变它。
或者,如果重要的话,请使用带FileShare
参数的FileStream
重载之一打开文件,打开StreamWriter
,然后写下文本。
它会抛出任何异常吗?
是。如果文件已经以不兼容的共享模式打开,则打开将失败。
答案 2 :(得分:4)
它会抛出任何异常吗?
是。您应确保在一个进程正在写入文件时,其他人不会使用lock
来读取该文件。即使您将FileShare
参数设置为Read
,例如允许随后打开文件进行读取而不立即抛出异常,这也不是一个好主意,因为这些读者可能会得到损坏的结果。