从Zip文件中删除文件夹

时间:2019-08-14 07:32:01

标签: excel vba zip

我正在尝试从Zip文件中删除文件夹。

所以我的文件结构如下:

enter image description here

内部优先:

enter image description here

我尝试在此处使用代码Deleting Files from A Zip,作者是Siddharth Rout,但它仅移动文件,显然文件夹变为空, 但未从Zip中删除

代码:

Sub del()


Dim oApp As Object
Dim fl As Object
Set oApp = CreateObject("Shell.Application")

    For Each fl In oApp.Namespace("C:\Users\mohit.bansal\Desktop\Test\test\first.zip\first").Items
    'Path to a folder inside the Zip
        oApp.Namespace("C:\Users\mohit.bansal\Desktop\Test\test\Dump").MoveHere (fl.path)
    Next

End Sub

显然,它将所有文件移动到文件夹Dump,但名为Second的文件夹在Zip中保持不变。尽管第二秒钟的所有文件也被移动了。

之后,我可以使用命令KillRmDir删除移动的文件和文件夹。但是,如何使第二个文件夹从Zip中消失。

注意:

  • 我并不是要从Zip中移走所有文件,这只是保持代码简短的测试条件。
  • 我不是在寻找一种解决方法来解压缩文件,删除文件夹并重新压缩所有内容。
  • 让我知道是否需要其他信息。

2 个答案:

答案 0 :(得分:8)

我能够删除该文件夹。

CreateObject("Shell.Application").Namespace("C:\Users\mohit.bansal\Desktop\Test\test\first.zip\first\second").Self.Verbs.Item(4).DoIt

如GSerb所指出的,最好使用InvokeVerb)"Delete"删除文件夹。

 CreateObject("Shell.Application").Namespace("C:\Users\mohit.bansal\Desktop\Test\test\first.zip\first\second").Self.InvokeVerb ("Delete")

我无法取消文件删除确认对话框。 enter image description here


因此,使用.Self.Verbs.Item(4),我们可以访问从0开始的右键单击选项。

演示:

enter image description here

附录

我最后的工作解决方案是将Xip文件的内容复制到临时文件夹,删除子文件夹,删除原始zip文件,创建新的zip文件,然后将其余项目复制到新的zip文件。 / p>

用法:

  DeleteZipSubDirectory "E:\first.zip","\first\second"   
Sub DeleteZipSubDirectory(ZipFile As Variant, SubFolderRelativePath As Variant)
    Dim tempPath As Variant

    'Make Temporary Folder
    tempPath = Environ("Temp") & "\"
    Do While Len(Dir(tempPath, vbDirectory)) > 0
        tempPath = tempPath & "0"
    Loop
    MkDir tempPath

    Dim control As Object
    Set control = CreateObject("Shell.Application")
    'Copy Zip Contents to Temporary Folder
    control.Namespace(tempPath).CopyHere control.Namespace(ZipFile).Items

    'Debug.Print tempPath

    With CreateObject("Scripting.FileSystemObject")
        'Delete Target Folder
        .DeleteFolder tempPath & SubFolderRelativePath
        'Delete Original FIle
        Kill ZipFile

        'First we create an empty zip file: https://www.exceltrainingvideos.com/zip-files-using-vba/
        Open ZipFile For Output As #1
        Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
        Close #1

        'Copy the Remaining Items into the new Zip File
        control.Namespace(ZipFile).CopyHere control.Namespace(tempPath).Items
        Application.Wait Now + TimeValue("0:00:02")
        'Delete Temporary Folder
        .DeleteFolder tempPath
    End With
End Sub

感谢Mikku和SiddharthRout的帮助。

答案 1 :(得分:0)

我设法通过设置WinAPI计时器在确认对话框中单击“是”来使TinMan的原始想法起作用。 API和TimerProc声明适用于VBA7以上版本。

awk -F '\t' 'index($NF, "_") == 0' file