首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >File.WriteAllText和并发访问

File.WriteAllText和并发访问
EN

Stack Overflow用户
提问于 2011-07-24 16:31:58
回答 3查看 6.9K关注 0票数 15

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-24 16:47:32

这是.net Framework4.0的源代码。显然,在内部使用FileShare.Read的情况下使用了StreamWriter。

代码语言:javascript
复制
    [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创建底层流的代码。

代码语言:javascript
复制
private static Stream CreateFile(string path, bool append)
{
    return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan);
}
票数 10
EN

Stack Overflow用户

发布于 2011-07-24 16:42:18

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

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

但由于它没有文档记录,一个补丁或新版本可以改变它。

或者,如果有必要,可以使用接受FileShare参数的FileStream重载之一自己打开文件,在此之上打开一个StreamWriter,然后编写文本。

会抛出任何异常吗?

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

票数 5
EN

Stack Overflow用户

发布于 2011-07-24 16:42:40

会抛出任何异常吗?

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6805757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档