使用VBA从Zip删除一些特定文件

时间:2019-06-28 08:57:34

标签: excel vba

在完整的宏过程中,我正在创建Zip的{​​{1}}文件。该文件夹包含多个子文件夹和文件。使用此代码:

Folder

现在,我需要检查邮政编码是否小于 20mb ,以便可以通过邮件发送。我发现可以使用以下行完成:

    Dim oApp As Object
    NewZip (s_path & "\" & acc_name & ".zip")
    Set oApp = CreateObject("Shell.Application")
    oApp.Namespace(s_path & "\" & acc_name & ".zip").CopyHere oApp.Namespace(s_path & "\" & acc_name & "\").items

        On Error Resume Next
        Do Until oApp.Namespace(s_path & "\" & acc_name & ".zip").items.Count = _
        oApp.Namespace(s_path & "\" & acc_name & "\").items.Count
        Application.Wait (Now + TimeValue("0:00:01"))
        Loop
        On Error GoTo 0

    Set oApp = Nothing

现在,如果文件大小超过 20mb ,我想从该邮编的一个特定子文件夹中删除所有文件。我不知道该怎么做。我是否应该像原始文件一样创建另一个zip文件,然后尝试跳过该子文件夹中的文件,还是可以通过某种方式删除Zip文件中的特定文件?


我正在尝试使用以下方法查看Zip内部的内容:

FileLen(path)

仍然无法进入Zip的子文件夹。

2 个答案:

答案 0 :(得分:6)

要从zip文件中删除文件,请尝试此操作。我正在演示如何删除一个文件。随时对其进行修改以满足您的需求

逻辑:

  1. 使用.MoveHere将文件移动到用户的临时目录。这将从zip文件中删除该文件
  2. 从临时目录中删除文件

代码:(经过测试)

Option Explicit

Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Const MAX_PATH As Long = 260

Sub Sample()
    Dim zipFile, oShellApp, fileToDelete, fl

    zipFile = "C:\Users\routs\Desktop\Desktop.zip"
    fileToDelete = "Tester.xlsm"

    Set oShellApp = CreateObject("Shell.Application")

    For Each fl In oShellApp.Namespace(zipFile).Items
        If fl.Name = fileToDelete Then
            oShellApp.Namespace(TempPath).MoveHere (fl)
        End If
    Next fl

    Kill TempPath & fileToDelete
End Sub

'~~> Function to get the user's temp path
Function TempPath() As Variant
    TempPath = String$(MAX_PATH, Chr$(0))
    GetTempPath MAX_PATH, TempPath
    TempPath = Replace(TempPath, Chr$(0), "")
End Function

替代

  1. 将所有相关文件添加到zip
  2. 之后,请循环检查文件大小,如果在可接受的范围内,请一一添加可选文件。

答案 1 :(得分:1)

使用Siddharth给出的答案中的提示。这小段代码有效。

幸运的是,您可以将Zip内部文件夹的路径直接传递到NameSpace并循环浏览其文件。

将路径用作C:\-----\Test.Zip\Folder\Folder

这很好用。

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.zip\Test\Password Removed Files").items 
    'Path to a folder inside the Zip
        oApp.Namespace("C:\Users\mohit.bansal\Desktop\Test\abc\").MoveHere (fl.Path)
    Next