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

17

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;
    }
    
задан G-. 22.10.2009 в 12:34
источник

2 ответа

38

Вы можете передать 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)) {
}
    
ответ дан Jb Evain 22.10.2009 в 12:40
источник
  • +1 это работает красиво. Спасибо. Хотя мне пришлось заменить «var» на FileStream & StreamReader. Что, по-видимому, было сделано var? Это VB? Я думаю, что этот ответ должен быть отредактирован, чтобы изменить их, но я не имею репутации, чтобы сделать это сам –  G-. 22.10.2009 в 13:18
  • О ключевом слове 'var', см. эту ссылку: msdn.microsoft.com/en-us/library/bb383973.aspx. Это ключевое слово является новым в C # 3.0+. –  pyrocumulus 22.10.2009 в 13:19
  • Aha. Спасибо облаку. Служит мне для работы в темные века. Позор я не могу +1 комментарий :-) –  G-. 22.10.2009 в 13:28
  • О, я могу +1 комментарий. Там мы идем –  G-. 27.10.2009 в 09:49
  • Вы также можете вызвать метод dispose - reader.dispose () в этом случае. –  Brian 15.08.2012 в 17:10
6

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

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

Обратите внимание на параметр FileAccess.Read по умолчанию, принятый для MSDN Ссылка

  

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

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

  

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

    
ответ дан DalSoft 17.10.2012 в 15:40
источник