2008-10-07 17 views
6

¿Hay alguna manera de crear mediante programación una carpeta comprimida en Windows? No puedo ver una manera de hacer esto usando el FileSystemObject (aunque existe el atributo 'Compressed').Crear una carpeta comprimida (o comprimida)

He visto zip dll pero preferiría evitar tener que volver a distribuir un dll si es posible. Windows XP soporta nativamente carpetas comprimidas después de todo.

+0

pregunta duplicados, consulte [Windows incorporado en la compresión ZIP script del poder?] (Http://stackoverflow.com/questions/30211/windows-built-in-zip-compression-script-able#124775) También respondí la pregunta con algún código de muestra y algunos enlaces: Jay

+0

Consulte la siguiente pregunta : [http://stackoverflow.com/questions/118547/creating-a-zip-file-on-windows-xp2003-in-cc](http://stackoverflow.com/questions/118547/creating-a-zip -file-on-windows-xp2003-in-cc). – warren

Respuesta

6

Tener un vistazo a los siguientes enlaces:

http://www.rondebruin.nl/windowsxpzip.htm

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1383147&SiteID=1

Excluyendo las partes importantes del ejemplo first link puede llegar a ser suficiente.

Sub NewZip(sPath) 
'Create empty Zip File 
'Changed by keepITcool Dec-12-2005 
    If Len(Dir(sPath)) > 0 Then Kill sPath 
    Open sPath For Output As #1 
    Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) 
    Close #1 
End Sub 

Function Split97(sStr As Variant, sdelim As String) As Variant 
'Tom Ogilvy 
    Split97 = Evaluate("{""" & _ 
         Application.Substitute(sStr, sdelim, """,""") & """}") 
End Function 

Sub Zip_File_Or_Files() 
    Dim strDate As String, DefPath As String, sFName As String 
    Dim oApp As Object, iCtr As Long, I As Integer 
    Dim FName, vArr, FileNameZip 

    DefPath = Application.DefaultFilePath 
    If Right(DefPath, 1) <> "\" Then 
     DefPath = DefPath & "\" 
    End If 

    strDate = Format(Now, " dd-mmm-yy h-mm-ss") 
    FileNameZip = DefPath & "MyFilesZip " & strDate & ".zip" 

    'Browse to the file(s), use the Ctrl key to select more files 
    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xl*), *.xl*", _ 
        MultiSelect:=True, Title:="Select the files you want to zip") 
    If IsArray(FName) = False Then 
     'do nothing 
    Else 
     'Create empty Zip File 
     NewZip (FileNameZip) 
     Set oApp = CreateObject("Shell.Application") 
     I = 0 
     For iCtr = LBound(FName) To UBound(FName) 
      vArr = Split97(FName(iCtr), "\") 
      sFName = vArr(UBound(vArr)) 
      If bIsBookOpen(sFName) Then 
       MsgBox "You can't zip a file that is open!" & vbLf & _ 
         "Please close it and try again: " & FName(iCtr) 
      Else 
       'Copy the file to the compressed folder 
       I = I + 1 
       oApp.Namespace(FileNameZip).CopyHere FName(iCtr) 

       'Keep script waiting until Compressing is done 
       On Error Resume Next 
       Do Until oApp.Namespace(FileNameZip).items.Count = I 
        Application.Wait (Now + TimeValue("0:00:01")) 
       Loop 
       On Error GoTo 0 
      End If 
     Next iCtr 

     MsgBox "You find the zipfile here: " & FileNameZip 
    End If 
End Sub 
+0

Creo que esto falla si los elementos están dentro de las carpetas. Si la carpeta de origen contiene 20 elementos, su espacio de nombre reportará 20, pero el espacio de nombre comprimido todavía reportará solo 1 elemento: la carpeta. –

Cuestiones relacionadas