File.WriteAllText и одновременный доступ - PullRequest
12 голосов
/ 24 июля 2011

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

Ответы [ 3 ]

9 голосов
/ 24 июля 2011

Это исходный код .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);
}
5 голосов
/ 24 июля 2011

MSDN не документирует, какой режим обмена используется.

Вы можете посмотреть исходный код (опубликованный или через дизассемблер) или посмотреть параметр во время выполнения (например, используя Process Monitor и затем перевести флаги API WIn32 в FileShare значение).

Но , поскольку не задокументировано, патч или новая версия могут его изменить.

В качестве альтернативы, если имеет значение, откройте файл самостоятельно, используя одну из перегрузок FileStream, которая принимает параметр FileShare, откройте StreamWriter поверх этого и затем запишите текст.

Будет ли выброшено какое-либо исключение?

Да. Если файл уже открыт в несовместимом режиме совместного доступа, открытие завершится неудачей.

4 голосов
/ 24 июля 2011

Будет ли какое-либо исключение?

Да.Вы должны убедиться, что, пока один процесс записывает в файл, другие не читают в него, используя lock.Даже если вы установите для параметра FileShare значение, например, Read, которое позволит открывать файл для последующего чтения и не генерировать исключение сразу, это не очень хорошая идея, поскольку эти читатели, вероятно, получат испорченные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...