File.WriteAllText and Concurrent Accesses

前端 未结 3 907
小鲜肉
小鲜肉 2021-01-08 00:20

Suppose I\'m writing a very long string to a file using File.WriteAllText, and another thread or process is trying to read the same file. Would it throw any exception? In ot

相关标签:
3条回答
  • 2021-01-08 01:00

    MSDN doesn't document which sharing mode is used.

    You could look at the source code (either published or via a disassembler), or look at the option at runtime (eg. using Process Monitor and then translating the WIn32 API flags into FileShare value).

    But as it isn't documented a patch or new version could change it.

    Alternatively if it matters open the file yourself using one of the FileStream overloads that takes a FileShare parameter, open a StreamWriter over this and then write the text.

    Would it throw any exception?

    Yes. If the file is open already with an incompatible sharing mode the open will fail.

    0 讨论(0)
  • 2021-01-08 01:04

    This is the source code from .net Framework 4.0. clearly StreamWriter is used that Uses FileShare.Read Internally.

        [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);
        }
    }
    

    This is the code that creates the underlying stream for 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);
    }
    
    0 讨论(0)
  • 2021-01-08 01:20

    Would it throw any exception?

    Yes. You should ensure that while one process is writing to a file others are not reading to it by using a lock. Even if you set the FileShare parameter to Read for example which would allow subsequent openings of the file for reading and not throw an exception immediately it is not a good idea as those readers would probably get corrupt results.

    0 讨论(0)
提交回复
热议问题