我試圖壓縮包含子文件夾和項目,文件夾使用Windows外殼CopyHere
命令:如何壓縮Windows中1個語句中的文件夾內容?
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms723207(v=vs.85).aspx
更新:注意,更喜歡本土solution--這是一個分佈式的Excel VBA工具,所以捆綁第三方文件並不理想。並且,需要同步壓縮。
我可以在文件夾輕鬆添加和其內容的zip:
所以我們知道在1個語句 CopyHere 可以過程中文件夾內的多個對象。
問題是,上面的命令將包含文件夾放在zip的根目錄,它的內容是它的內容。但是,我不想要包含的文件夾 - 只是其內容。
的文檔提到一個通配符(選項128),但是當我使用通配符,我得到一個錯誤:
oShell.Namespace(sZipPath).CopyHere "C:\My Folder\*"
The file name you specified is not valid or too long.
也許還有用我上面的第一個命令的方式,然後移動zip中的項目到zip的根目錄?
循環訪問源文件夾中的每個項目,每次添加一個到zip將是可接受的。但是,因爲CopyHere是異步的,所以如果之前的CopyHere沒有完成,每個後續的CopyHere都會失敗。該修復程序都不工作,針對此問題:
比較在源文件夾和目標拉鍊項目數失敗,因爲如果壓縮包含一個文件夾,則計爲只有1個項目(其中包含的項目不計https://stackoverflow.com/a/16603850/209942
等待一段時間之間的每一項工作,但計時器是不可接受的。這是任意的,我不能提前猜大小或壓縮時間每個對象的
檢查,看看。如果我阻止我的循環,直到文件不是loc ked,我仍然遇到文件訪問錯誤。 https://stackoverflow.com/a/6666663/209942
Function FileIsOpen(sPathname As String) As Boolean ' true if file is open
Dim lFileNum As Long
lFileNum = FreeFile
Dim lErr As Long
On Error Resume Next
Open sPathname For Binary Access Read Write Lock Read Write As #lFileNum
lErr = Err
Close #lFileNum
On Error GoTo 0
FileIsOpen = (lErr <> 0)
End Function
更新: VBA可以調用殼同步命令(而不是創建在VBA一個shell32.shell
對象),所以如果CopyHere工作在命令行或PowerShell的,這可能是解。正在調查......
我會說你最好的選擇是堅持'CopyHere'並添加一個循環,等到一切都被添加到zip壓縮文件。在我的答案[here](http://stackoverflow.com/a/22050803/1630171)中包含函數中的代碼應該不會太困難。 –
thx,@AnsgarWiechers,但正如我在我的OP中指出的那樣,「比較項目數量失敗,因爲如果zip包含一個文件夾,則僅計入1個項目 - 文件夾內的項目不計入。」那,我不喜歡投票循環。我已經解決了這個問題,並在下面發佈了一個高級(對我來說)解決方案。 –
只有直接子項目(文件和文件夾)的數量是相關的,而不是在該級別下嵌套的項目數量。我用我的答案測試了這個確切場景中的代碼(壓縮包含文件和子文件夾的文件夾,其中包含一些相當大的文件),並且它按照原樣運行(意味着等待循環僅在添加子文件夾的所有子元素後才終止)。 –