File.WriteAllText和Concurrent Accesses

Fey*_*yaz 14 c# concurrency file writealltext

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

Meh*_*ran 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是为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);
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*ard 5

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

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

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

或者,如果重要的是使用其中一个FileStreamFileShare参数的重载打开文件,打开一个StreamWriter然后写入文本.

会抛出任何异常吗?

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