Подтвердить что ты не робот

Могу ли я запретить 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;
    }
4b9b3361

Ответ 1

Вы можете передать 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)) {
}

Ответ 2

Думаю, что я бы добавил некоторый контекст, 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).

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