解压缩.gz文件

时间:2014-02-04 09:18:25

标签: excel shell vba unzip

我有一个包含30个左右.gz压缩文件和1个.zip文件的文件夹。我可以使用Windows资源管理器来解压缩1 .zip文件,但不幸的是,Windows资源管理器不会解压缩.gz文件。我已经创建了使用Winzip打开所有这些文件的代码,但不幸的是,这会打开路径文件夹,每次解压缩时,我最终会有30多个打开的文件夹,然后我会逐一关闭,不需要进一步代码。这个过程大约需要10分钟。

在网上搜索,我发现并改编了Ron De Bruin代码,该代码利用“7-zip”软件,开源并在线免费提供,解压缩,无需每次都打开新文件夹。它在大约一分钟内毫不费力地解压缩所有文件,更好。代码如下(主要是注释,所以不会像它第一次看到的那样!)。我唯一的问题是,有时这会解压缩文件,有时这会运行而不会解压缩任何文件。当它运行完美时,它会更长时间地切换'GetExitCodePorcess hProcess,ExitCode'行,我假设它是获取ExitCode的进程,允许它解压缩文件。当它不工作时,它只切换一次或两次并移动到下一个阶段,因此,我认为它生成了错误的退出代码。 问题是PtrSafe功能吗?还是在我的ShellStr或其他任何地方?请帮助,因为我想避免使用Winzip方法。如果有人有任何其他选择,请建议!

#If VBA7 Then
Private Declare PtrSafe Function OpenProcess Lib "kernel32" _
    (ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long

Private Declare PtrSafe Function GetExitCodeProcess Lib "kernel32" _
    (ByVal hProcess As Long, _
    lpExitCode As Long) As Long
#Else
Private Declare Function OpenProcess Lib "kernel32" _
    (ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" _
    (ByVal hProcess As Long, _
    lpExitCode As Long) As Long
#End If


Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const STILL_ACTIVE = &H103


Public Sub ShellAndWait(ByVal PathName As String, Optional WindowState)
Dim hProg As Long
Dim hProcess As Long, ExitCode As Long
'fill in the missing parameter and execute the program
If IsMissing(WindowState) Then WindowState = 1
hProg = Shell(PathName, WindowState)
'hProg is a process ID under Win32. To get the process handle:
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, hProg)
Do
    'populate Exitcode variable
    GetExitCodeProcess hProcess, ExitCode
    DoEvents
Loop While ExitCode = STILL_ACTIVE
End Sub






'With this example you unzip a fixed zip file: FileNameZip = "C:\Users\Ron\Test.zip"
'Note this file must exist, this is the only thing that you must change before you test it
'The zip file will be unzipped in a new folder in: Application.DefaultFilePath
'Normal if you have not change it this will be your Documents folder
'The name of the folder that the code create in this folder is the Date/Time
'You can change this folder to this if you want to use a fixed folder:
'NameUnZipFolder = "C:\Users\Ron\TestFolder\"
'Read the comments in the code about the commands/Switches in the ShellStr

Public Sub B_UnZip_Zip_File_Fixed()
Dim PathZipProgram As String, FolderPath As String
Dim UnzipFile As Variant, ShellStr As String

FolderPath = _
    ThisWorkbook.Path
    If Right(FolderPath, 1) <> "\" Then
                FolderPath = FolderPath & "\"
    End If


'Path of the Zip program
PathZipProgram = "C:\program files\7-Zip\"
If Right(PathZipProgram, 1) <> "\" Then
    PathZipProgram = PathZipProgram & "\"
End If

'Check if this is the path where 7z is installed.
If Dir(PathZipProgram & "7z.exe") = "" Then
    MsgBox "Please find your copy of 7z.exe and try again"
    Exit Sub
End If


 UnzipFile = _
    Dir(FolderPath & "*.gz")
 While UnzipFile <> _
    ""
 If InStr(1, UnzipFile, ".gz") > _
    0 Then
    ShellStr = PathZipProgram & "7z.exe e -aoa -r" _
         & " " & Chr(34) & UnzipFile & Chr(34) _
         & " -o" & Chr(34) & FolderPath & Chr(34) & " " & "*.*"
ShellAndWait ShellStr, vbHide
 End If
 UnzipFile = _
    Dir
Wend
'Create path and name of the normal folder to unzip the files in
'In this example we use: Application.DefaultFilePath
'Normal if you have not change it this will be your Documents folder
'The name of the folder that the code create in this folder is the Date/Time
'NameUnZipFolder = Application.DefaultFilePath & "\" & Format(Now, "yyyy-mm-dd h-mm-ss")
'You can also use a fixed path like
'NameUnZipFolder = "C:\Users\Ron\TestFolder\"

'Name of the zip file that you want to unzip (.zip or .7z files)
'FileNameZip = "C:\Users\Ron\Test.zip"

'There are a few commands/Switches that you can change in the ShellStr
'We use x command now to keep the folder stucture, replace it with e if you want only the files
'-aoa Overwrite All existing files without prompt.
'-aos Skip extracting of existing files.
'-aou aUto rename extracting file (for example, name.txt will be renamed to name_1.txt).
'-aot auto rename existing file (for example, name.txt will be renamed to name_1.txt).
'Use -r if you also want to unzip the subfolders from the zip file
'You can add -ppassword if you want to unzip a zip file with password (only .7z files)
'Change "*.*" to for example "*.txt" if you only want to unzip the txt files
'Use "*.xl*" for all Excel files: xls, xlsx, xlsm, xlsb

'MsgBox "Look in " & NameUnZipFolder & " for extracted files"

End Sub

1 个答案:

答案 0 :(得分:1)

不,exit code会告诉您产生的外部流程的结果。对于Windows 0表示成功,非零表示失败(或其他意味着该过程不成功的事件)

所以基本上对于一些.gz文件,7zip无法成功完成。你作为编码员需要处理这种可能的可能性。

所以最好的办法是打印/记录它运行的{1}}的7zip命令,并在命令提示符/ dos窗口中手动运行,看看原因。