Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

File.WriteAllText and Concurrent Accesses

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 other words, what is the FileShare parameter that the File.WriteAllText method uses? It's not written in the documentation!

like image 789
Feyyaz Avatar asked Jul 24 '11 08:07

Feyyaz


3 Answers

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);
}
like image 178
Mehran Avatar answered Nov 01 '22 12:11

Mehran


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.

like image 25
Richard Avatar answered Nov 01 '22 13:11

Richard


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.

like image 4
Darin Dimitrov Avatar answered Nov 01 '22 14:11

Darin Dimitrov