File.ReadLines без блокировки?

Я могу открыть FileStream с помощью

new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

Без блокировки файла.

Я могу сделать то же самое с File.ReadLines(string path)?

Ответ 1

Нет... Если вы посмотрите с помощью Reflector, вы увидите, что в конце File.ReadLines откроется FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 0x1000, FileOptions.SequentialScan);

Итак, общий доступ только для чтения.

(он технически открывает StreamReader с FileStream, как описано выше)

Я добавлю, что для создания статического метода кажется, что это детская игра:

public static IEnumerable<string> ReadLines(string path)
{
    using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan))
    using (var sr = new StreamReader(fs, Encoding.UTF8))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

Это возвращает IEnumerable<string> (что-то лучше, если файл имеет много тысяч строк, и вам нужно только разобрать их по одному). Если вам нужен массив, назовите его ReadLines("myfile").ToArray() с помощью LINQ.

Помните, что логически, если файл изменяется "за его спиной (от метода)", как все будет работать довольно undefined (он, вероятно, технически определен, но определение, вероятно, довольно длинное и сложное )

Ответ 2

File.ReadLines() заблокирует файл до его завершения.