Можно ли запретить StreamReader блокировать текстовый файл во время его использования? - PullRequest
19 голосов
/ 22 октября 2009

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;
    }

Ответы [ 2 ]

42 голосов
/ 22 октября 2009

Вы можете передать 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)) {
}
6 голосов
/ 17 октября 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...