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() заблокирует файл до его завершения.