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

Как я могу прочитать файл даже при получении исключения "в использовании другим процессом"?

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

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

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

Или в С#:

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

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

4b9b3361

Ответ 1

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();

Оригинальный источник кода

Ответ 2

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

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

Ответ 3

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

Вы должны указать тот же самый режим 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);

Ответ 4

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

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

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