Изменить файл с открытой ручкой

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

Я пытаюсь изменить (не удалить) тот же файл с помощью PowerShell, а не с помощью блокнота.

В общем, я бы просто использовал что-то вроде:

$File = "F:\Event Data\Exchange.txt"
(Get-Content $File) -replace ' - TextToBeRemoved ', ' - ' | Set-Content $File

Это вызывает ошибку в PowerShell:

Set-Content : The process cannot access the file 'F:\Event Data\Exchange.txt' because it is being used by another process.

Так что, если я смогу изменить и сохранить контент через Блокнот, что в PowerShell будет эквивалентным? Я бы предпочел не выслеживать и не убивать открытый процесс, так как это вызовет другие / более серьезные проблемы.

Я также пробовал это с той же ошибкой:

(Get-Content $File) | foreach-object {$_ -replace ' - TextToBeRemoved ', ' - '} | Set-Content $File 

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

Благодарю.

1 ответ

Одна из возможностей заключается в использовании System.IO.FileStream учебный класс. Вы можете указать любой доступ к файлу. Вы также можете указать режим файла. Или, если это не сработает, вы можете использовать API P/Invoke Win32 CreateFile / ReadFile / WriteFile / CloseFile.

Но, как отметил Гарри в комментариях, вам нужно выяснить, какая операция не удалась, и монитор процесса - хороший способ сделать это. Я бы отфильтровал процесс PowerShell и код возврата ошибки.

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

В конечном итоге большинство всех файлов пользовательского режима открывается и создается в воронке Windows через CreateFile. Если вы идете по маршруту P/Invoke, вы можете точно дублировать то, что делает Notepad.

Другие вопросы по тегам