PowerShell: ошибка при чтении файлов, открытых в других программах

Здравствуйте, эксперты PowerShell.

Приведенный ниже фрагмент скрипта работает при добавлении файлов в Zip-файл. Однако, если добавляемый файл открыт в другой программе, происходит сбой с исключением: «Процесс не может получить доступ к файлу [..]». Я пытался использовать [IO.FileShare]::ReadWrite, но пока безуспешно.

Любое предложение о том, как открыть файлы для чтения и записи в zip независимо от того, открыт файл в другой программе или нет?

Источник сценария

# write entries with relative paths as names
foreach ($fname in $FullFilenames) {
    $rname = $(Resolve-Path -Path $fname -Relative) -replace '\.\\',''
    Write-Output $rname
    $zentry = $zip.CreateEntry($rname)
    $zentryWriter = New-Object -TypeName System.IO.BinaryWriter $zentry.Open()
    $zentryWriter.Write([System.IO.File]::ReadAllBytes($fname)) #FAILS HERE
    $zentryWriter.Flush()
    $zentryWriter.Close()
}

конструктор $handle = [System.IO.File]::Open($fname, 'Open', 'Read', 'ReadWrite') открывает файл. Как мы читаем байты из этого файла, чтобы его можно было записать в zip-архив?

user5349170 22.04.2022 21:01

подождите, я удалил свой комментарий, потому что вы упомянули «Я пытался использовать [IO.FileShare]::ReadWrite», и это не сработало. работает ли то, что я написал раньше?

Santiago Squarzon 22.04.2022 21:05

Ваше предложение работает, пытаясь найти, как мы читаем байты из этого открытого файла для записи в zip. PS C:\Temp> $handle CanRead: True CanWrite: False CanSeek: True IsAsync: False Длина: 18970 Имя: C:\Temp\targetfile.docx Позиция: 0 Обработчик: 3104 SafeFileHandle: Microsoft.Win32.SafeHandles.SafeFileHandle CanTimeout: False ReadTimeout : WriteTimeout :

user5349170 22.04.2022 21:11

Скрипт из следующей темы, автор user2349693. Он отлично работает без каких-либо проблем, если файлы не заблокированы. stackoverflow.com/questions/51392050/…

user5349170 22.04.2022 21:15
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
4
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку нам не хватает какой-то важной части вашего кода, я просто предположу, что может работать в этом случае, и буду следовать предположениям, основанным на ваших комментариях.

Сначала вы должны открыть файл с FileShare.ReadWrite:

$handle = [System.IO.File]::Open($fname, 'Open', 'Read', 'ReadWrite')

Затем вы сможете использовать .CopyTo(Stream) метод из FileStream:

$zentry  = $zip.CreateEntry($rname)
$zstream = $zentry.Open()
$handle.CopyTo($zstream)
$zstream.Flush()
$zstream.Dispose()
$handle.Dispose()

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