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

StackOverflow https://stackoverflow.com/questions/1606349

Вопрос

Программа 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;
    }
Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top