Предположим, что я пишу очень длинную строку в файл, используя File.WriteAllText, а другой поток или процесс пытается прочитать тот же файл. Может ли это вызвать какое-либо исключение? Другими словами, что такое параметр FileShare, который использует метод File.WriteAllText? Это не написано в документации!
File.WriteAllText и параллельные доступы
Ответ 1
Это исходный код из .net Framework 4.0. явно используется StreamWriter, который использует 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);
}
}
Это код, который создает базовый поток для 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);
}
Ответ 2
MSDN не документирует, какой режим обмена используется.
Вы можете посмотреть исходный код (либо опубликованный, либо дизассемблер), либо посмотреть на параметр во время выполнения (например, используя Process Monitor, а затем перевод флагов API WIn32 в FileShare
значение.)
Но поскольку он не документирован, патч или новая версия могут его изменить.
Альтернативно, если вам важно открыть файл самостоятельно, используя одну из FileStream
перегрузок, которая принимает параметр FileShare
, откройте a StreamWriter
, а затем запишите текст.
Может ли это исключение?
Да. Если файл открыт уже с несовместимым режимом совместного доступа, сбой будет открытым.
Ответ 3
Может ли это исключение?
Да. Вы должны убедиться, что, хотя один процесс записывает в файл, другие не читают его, используя lock
. Даже если вы установите параметр FileShare
на Read
, например, который позволит последующие открытия файла для чтения и не вызывать исключение сразу же, это не очень хорошая идея, поскольку эти читатели, вероятно, получат поврежденные результаты.