Могу ли я запретить StreamReader блокировать текстовый файл во время его использования?

StreamReader блокирует текстовый файл во время его чтения.
Можно ли заставить StreamReader работать в режиме «только для чтения» или «без блокировки»?

Мой обходной путь — скопировать файл во временное место и прочитать его оттуда, но я бы предпочел использовать StreamReader напрямую, если это возможно. Любые альтернативные предложения?

Предыстория:
Я написал небольшое приложение для получения статистики из файла журнала. Этот файл постоянно обновляется (несколько раз в секунду) внешней программой, позволяющей вызвать AAXXYY.

Просмотр вывода предполагает, что мое приложение может блокировать файл и не позволять записи AAXXYY.

Это то, что я делаю

    private void btnGetStats_Click(object sender, EventArgs e)
    {
        int countStarts = 0;
        int countEnds = 0;

        IList<string> sessions = new List<string>();

        using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode))
        {
            while(!stRead.EndOfStream)
            {
                string line = stRead.ReadLine();
                if(line.Contains("Session start"))
                {
                    countStarts++;
                    sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
                if (line.Contains("Session end"))
                {
                    countEnds++;
                    sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
            }
        }

        txtStarts.Text = countStarts.ToString();
        txtEnds.Text = countEnds.ToString();
        txtDifference.Text = (countStarts - countEnds).ToString();

        listBox1.DataSource = sessions;
    }

person G-.    schedule 22.10.2009    source источник


Ответы (2)


Вы можете передать FileStream в StreamReader и создать FileStream с правильным значением FileShare. Например:

using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var reader = new StreamReader (file, Encoding.Unicode)) {
}
person Jb Evain    schedule 22.10.2009
comment
+1 это прекрасно работает. Спасибо. Хотя мне пришлось заменить var на FileStream и StreamReader. Что должен был делать вар? Это ВБ? Я думаю, что этот ответ следует отредактировать, чтобы изменить его, но у меня нет представителя, чтобы сделать это самому. - person G-.; 22.10.2009
comment
О ключевом слове «var» см. эту ссылку: msdn.microsoft.com/en -us/library/bb383973.aspx. Это ключевое слово является новым в C# 3.0+. - person pyrocumulus; 22.10.2009
comment
Ага. Спасибо облако. Поделом мне для работы в темные века. Жаль, что нельзя добавить +1 к комментарию :-) - person G-.; 22.10.2009
comment
О, я могу +1 комментарий. Вот и мы - person G-.; 27.10.2009
comment
Вы также можете вызвать метод dispose — в этом случае reader.dispose(). - person Brian; 15.08.2012
comment
@Brian вызов using операторы автоматически распоряжаться, когда они завершают - person Rufus L; 08.06.2017

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

 new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan);

Обратите внимание на параметр FileAccess.Read по умолчанию, используемый для MSDN http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

Позволяет последующее открытие файла для чтения. Если этот флаг не указан, любой запрос на открытие файла для чтения (этим процессом или другим процессом) не будет выполнен до тех пор, пока файл не будет закрыт. Однако даже если этот флаг указан, для доступа к файлу могут потребоваться дополнительные разрешения.

Снова взято из MSDN, чтобы разрешить чтение и запись вместо этого использовать FileAccess.ReadWrite (как предложил Jb Evain).

Позволяет последующее открытие файла для чтения или записи. Если этот флаг не указан, любой запрос на открытие файла для чтения или записи (этим процессом или другим процессом) будет завершаться ошибкой до тех пор, пока файл не будет закрыт. Однако даже если этот флаг указан, для доступа к файлу могут потребоваться дополнительные разрешения.

person DalSoft    schedule 17.10.2012