[英]Delete specific files from folder, inside a war file using ZipArchive class
我的目標是從 WAR 中獲取一些文件,進行更改,從 WAR 中刪除舊文件,然后將編輯后的文件移動到 WAR。
目前,我可以使用 ZipArchive class 從 WAR 文件中查找、編輯、刪除和移動文件。 但我面臨的問題是我無法從 WAR 中的特定文件夾中刪除文件,只是按名稱。
鑒於我的 WAR 結構:
〜/戰爭
~/war/client/lib/file.jar
~/war/server/lib/file.jar
在我達到這一點之前,我一直在使用以下 function 來刪除文件:
function Remove-FilesFromZip {
param(
[string]$ZipFile,
[string]$FileName
)
try {
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression')
$Retorno
$stream = New-Object IO.FileStream($ZipFile, [IO.FileMode]::Open)
$mode = [IO.Compression.ZipArchiveMode]::Update
$zip = New-Object IO.Compression.ZipArchive($stream, $mode)
Write-Host "$zip $mode $stream $Retorno"
($zip.Entries | Where-Object { $FileName -contains $_.Name }) | ForEach-Object { $_.Delete() }
Write-Host "$FileName excluido de $ZipFile"
}
catch {
Write-Host "Erro ao excluir $FileName de $ZipFile"
$zip.Dispose()
$stream.Close()
$stream.Dispose()
}
$zip.Dispose()
$stream.Close()
$stream.Dispose()
}
由於我要刪除的文件只在我的 WAR 上出現過一次,所以這不是問題,但如果我嘗試這樣的事情:
Remove-FilesFromZip "C:/pathToWar/warFile.war" "file.jar"
這兩個文件都從戰爭中刪除。
如果我嘗試像這樣使用路徑:
Remove-FilesFromZip "C:/pathToWar/warFile.war" "/server/lib/file.jar"
什么都沒發生。
如何編輯我的 function 以便描述要刪除的文件的路徑?
另外,對於上下文,我還有另一個 function ,我在這個之后使用,我可以將文件移動到戰爭和所需的文件夾,但是當我移動而不刪除同名文件時,我在里面得到了重復的文件,這不是可取的。
這是 function:
function Move-FileToZip {
param(
$ZipFileName,
$FileNameInZip,
$NewFileToAdd
)
try {
# Write-LogWIthTime "-------------- Move-FileToZip --------------"
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | Out-Null
$zip = [System.IO.Compression.ZipFile]::Open($ZIPFileName, "Update")
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | Out-Null
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $NewFileToAdd, $FileNameInZip, "Optimal") | Out-Null
$zip.Dispose()
Write-Host "Adicionado com sucesso $NewFileToAdd as $FileNameInZip para $ZIPFileName "
}
catch {
$zip.Dispose()
Write-Host "Falha ao adicionar $NewFileToAdd para $ZIPFileName . Detalhes : $_"
}
}
我用作:
Move-FileToZip "C:/pathToWar/warFile.war" "/server/lib/file.jar" "C:/updatedFiles/server/lib/file.jar"
對我來說,理想的情況是在我使用 Move-FileToZip function 時簡單地更新文件,但只要讓 Remove-FilesFromZip 按照我的意圖工作就太好了!
您的Remove-FilesFromZip
function 的問題是您正在使用Name
屬性過濾 Zip 條目,因此您無法區分具有相同名稱但位於不同目錄的文件。
$zip.Entries | Where-Object { $FileName -contains $_.Name }
如果您使用FullName
屬性進行過濾,那么您應該能夠使用 zip 文件中的全名來定位特定文件:
$zip.Entries | Where-Object { $FileName -eq $_.FullName }
通過該更改,您應該能夠執行以下操作,假設client
是 zip 文件中的頂級目錄:
Remove-FilesFromZip "C:/pathToWar/warFile.war" "client/lib/file.jar"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.