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