【问题标题】:How can I be sure that a very large zip file is finished compressing?如何确定一个非常大的 zip 文件已完成压缩?
【发布时间】:2017-07-08 20:04:05
【问题描述】:

我正在编写一个 VBScript 来尝试将不同位置的多个目录压缩到同一个 Zip 文件中。

我正在使用的当前解决方案是遍历我要压缩的目录(其中当前有 2 个),获取文件对象并使用 copyHere 方法将源文件夹复制到具有正确标题的 zip 文件中格式。

那部分似乎工作正常,我遇到的困难是错误检查。我在网上找到的唯一两个解决方案是获取源目录和目标目录中的对象计数并休眠直到它们相同,或者检查 zip 文件是否打开以进行附加并休眠直到它是。

第一个选项在一个目录下很容易,但在多个文件夹下变得更加乏味,更不用说 Windows 可能会在完成复制之前在目标目录中创建一个对象,并且我正在压缩可能超过 10 GB 的文件,以便解决方案不起作用。

我曾尝试实施第二个解决方案,但每次循环到第二次调用 CopyHere 时,它​​都会告诉我 zip 文件在第一次迭代时已损坏。用 VBScript 不能把非常大的文件压缩成 zip 吗?

关于如何检查压缩是否使用 VBScript 完成的任何其他建议都会非常有帮助。

【问题讨论】:

  • 存在 zip 大小超过 2GB/4GB 的问题,至少 herehere

标签: windows vbscript zip compression large-files


【解决方案1】:

这里是Function Create_WinRar_Archive(Source,Target_Archive,Password)用Winrar的rar.exe命令行压缩文件夹。 我们可以通过两种方式调用这个函数:

如果你想创建一个没有密码的存档,所以我们这样称呼它:

Call Create_WinRar_Archive(Source,Target_Archive,"")

或者如果你想为这个存档设置一个密码,我们称之为:

Call Create_WinRar_Archive(Source,Target_Archive,Password)

这是一个压缩图片文件夹

的例子
Option Explicit
Dim ws,Source,Target_Archive,Password
Set ws = CreateObject("Wscript.Shell")
Source = ws.ExpandEnvironmentStrings("%userprofile%\pictures")
Target_Archive = "C:\BackupImages.rar"
Password = "123456"
Call Create_WinRar_Archive(Source,Target_Archive,Password)
Wscript.echo "All files are archived successfully !"
ws.run "Explorer " & Target_Archive
'******************************************************************************************************
Function Create_WinRar_Archive(Source,Target_Archive,Password)
'This function executes the command line
'version of WinRAR and reports whether
'the archive exists after WinRar exits.
'If it exists then it returns true. If
'not it returns an error message.
'------------------------------------------------------------------------------------
    Dim oFSO,oShell,aScriptFilename,sScriptFilename
    Dim sWorkingDirectory,ProgramFiles,sWinRarLocation
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oShell = CreateObject("Wscript.Shell")
'--------Find Working Directory--------
    aScriptFilename = Split(Wscript.ScriptFullName, "\")
    sScriptFilename = aScriptFileName(Ubound(aScriptFilename))
    sWorkingDirectory = Replace(Wscript.ScriptFullName, sScriptFilename, "")
'-------Ensure we can find Winrar.exe------
 If oFSO.FileExists(sWorkingDirectory & " " & "Winrar.EXE") Then
    sWinRarLocation = ""
    ElseIf oFSO.FileExists(oShell.ExpandEnvironmentStrings("%ProgramFiles%\Winrar\rar.exe")) Then
        sWinRarLocation = oShell.ExpandEnvironmentStrings("%programfiles%\Winrar\")
    ElseIf oFSO.FileExists(oShell.ExpandEnvironmentStrings("%ProgramFiles(x86)%\Winrar\rar.exe")) Then
        sWinRarLocation = oShell.ExpandEnvironmentStrings("%programfiles(x86)%\Winrar\")
  Else
    Create_WinRar_Archive = "Error: Couldn't find Winrar.EXE"
    Exit Function
  End If
  '--------------------------------------
'The Command "A" Means ==> add to archive
'To create a WinRar file with the specified name after command A (archive) and the switches -ep1 (exclude base directory from names) and -r (recursive)
    If Password = "" Then
        oShell.Run """" & sWinRarLocation & "rar.exe"" A -ep1 -r """ & _
        Target_Archive & """ """ & Source & """",0,True
    Else
'The -hp<password> switch: To use a password
        oShell.Run """" & sWinRarLocation & "rar.exe"" A -ep1 -r -hp"&Password&" """ & _
        Target_Archive & """ """ & Source & """",0,True
    End If
    If oFSO.FileExists(Target_Archive) Then
        Create_WinRar_Archive = 1
    Else
        Create_WinRar_Archive = "Error: Creating archives failed !"
        MsgBox Create_WinRar_Archive,16,Create_WinRar_Archive
    End If
End Function
'****************************************************************************************************

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2011-03-04
    • 2011-10-17
    • 2018-11-08
    • 2013-05-28
    • 2011-08-03
    相关资源
    最近更新 更多