Как я могу прочитать файл, даже если получено исключение «используется другим процессом»? - PullRequest
44 голосов
/ 09 декабря 2010

В VB.NET или C # я пытаюсь прочитать содержимое текстового файла, который используется другой программой (в том-то и дело, что на самом деле я не могу остановить программу или она перестает писать в текстфайл, и я хочу периодически читать то, что в настоящее время находится в текстовом файле в другой программе).

Это код, который я использую (VB.NET)

Dim strContents As String
Dim objReader As StreamReader
objReader = New StreamReader(FullPath)
strContents = objReader.ReadToEnd()
objReader.Close()

Илив C #:

var objReader = new StreamReader(FullPath);
var strContents = objReader.ReadToEnd();
objReader.Close();

Приведенное выше, однако, вызывает исключение ввода-вывода «Процесс не может получить доступ к файлу file.txt, поскольку он используется другим процессом».Есть ли обходные пути в этом сценарии?

Ответы [ 4 ]

67 голосов
/ 09 декабря 2010
FileStream logFileStream = new FileStream("c:\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader logFileReader = new StreamReader(logFileStream);

while (!logFileReader.EndOfStream)
{
    string line = logFileReader.ReadLine();
    // Your code here
}

// Clean up
logFileReader.Close();
logFileStream.Close();

Исходный код для кода

8 голосов
/ 09 декабря 2010

Я сделаю рыбу.Режим FileShare является критическим, вы должны разрешить совместное использование записи.Это нельзя отрицать, так как процесс, который записывает файл, уже получил доступ на запись.Конструктор StreamReader () использует FileShare.Read и не имеет возможности использовать другое значение.Использование конструктора StreamReader (Stream) - это действительно обходной путь.

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

4 голосов
/ 26 августа 2012

Это зависит от режима FileShare, в котором файл был открыт другим приложением, добавляющим файл.Когда другое приложение открывало файл, оно указывало режим FileShare для доступа других файлов к файлу.Этот режим FileShare мог бы быть чтение, запись, оба, удаление, все это или ни одного .

Вы должны указать тот же режим FileShare, что и другое приложение.указано.Если в другом приложении разрешено только чтение, используйте FileShare.Read;, если разрешено чтение и запись, используйте FileShare.ReadWrite.

StreamReader использует только режим FileShare.Read, так что вы уже можете предположить, чтоправильный.Итак, попробуйте ReadWrite, вот так:

FileStream fs = new FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader reader = new StreamReader(fs);
2 голосов
/ 09 декабря 2010

Не уверен, как это будет вести себя с уже открытым файлом, но это не даст приложению заблокировать его:

FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs);

Надеюсь, это поможет!

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