File.ReadLines без блокировки? - PullRequest
14 голосов
/ 17 марта 2011

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

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

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

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

Ответы [ 2 ]

34 голосов
/ 17 марта 2011

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

So Общий доступ только для чтения.

(технически открывается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.

Обратите внимание, что логически, если файл изменяется «за его спиной (метода)», как все будет работать, совершенно не определено(это, вероятно, технически определено, но определение, вероятно, довольно длинное и сложное)

2 голосов
/ 17 марта 2011

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

...