Подтвердить что ты не робот

File.WriteAllText и параллельные доступы

Предположим, что я пишу очень длинную строку в файл, используя File.WriteAllText, а другой поток или процесс пытается прочитать тот же файл. Может ли это вызвать какое-либо исключение? Другими словами, что такое параметр FileShare, который использует метод File.WriteAllText? Это не написано в документации!

4b9b3361

Ответ 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, например, который позволит последующие открытия файла для чтения и не вызывать исключение сразу же, это не очень хорошая идея, поскольку эти читатели, вероятно, получат поврежденные результаты.