Перезаписать текстовый файл, который используется другим процессом? - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть файл журнала, который открыт и используется другой программой, и я прочитал его содержимое со следующим:

    Dim strContents As String
    Dim x As New FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    Dim objReader As StreamReader
    objReader = New StreamReader(x)
    strContents = objReader.ReadToEnd()
    objReader.Close()

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

Я пытался

    Dim sWrite As StreamWriter
    sWrite = New System.IO.StreamWriter(FullPath, False)
    sWrite.Write("")
    sWrite.Close()

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

Dim fs As New FileStream(FullPath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 10 декабря 2010

Есть несколько других сообщений на эту тему.

Определение, заблокирован ли файл другим процессом (или действительно тем же процессом)

Как проверить блокировку файла?

Могу ли я просто «прочитать» файл, который используется?

Решение выглядит следующим образом:

Try
'Code to read file if its not locked by another app
Catch as System.IO.IOException

Также просто к вашему сведению что ваш журналФайл является неуправляемым ресурсом, поэтому детерминированная финализация поможет решить эту проблему.Используйте оператор Using для детерминированной финализации, например:

Using fs = New FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
    fs.SetLength(0)
    file.Save(fs)
    fs.Flush()
End Using
0 голосов
/ 10 декабря 2010

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

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

0 голосов
/ 10 декабря 2010

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

Вот пример, чтобы сделать это.

Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("notepad")

For Each p As Process In pProcess
    p.Kill()
Next

Проверьте это: http://vbnetsample.blogspot.com/2007/08/start-and-kill-process.html

0 голосов
/ 10 декабря 2010

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

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