15

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

4

3 回答 3

10

这是来自 .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);
}
于 2011-07-24T08:47:31.610 回答
5

MSDN没有记录使用哪种共享模式。

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

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

或者,如果重要的是使用FileStreamFileShare参数的重载之一自己打开文件,请在上面打开 aStreamWriter然后写入文本。

它会抛出任何异常吗?

是的。如果文件已使用不兼容的共享模式打开,则打开将失败。

于 2011-07-24T08:42:17.830 回答
4

它会抛出任何异常吗?

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

于 2011-07-24T08:42:40.153 回答