簡體   English   中英

使用 ZipArchive class 從文件夾中刪除特定文件,在 war 文件中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM