Формирование списка файлов с последующей упаковкой в архив - VB
Формулировка задачи:
Подскажите код для формирование списка файлов с последующей упаковкой в архив.
Тип файлов не важен, например /txt.
Возможно ли решать эту задачу если на пк пользователя нет архиватора.
Желательно, чтобы прога запускалась по нажатию на кнопку.
Тип файла и место конечного архива указаны заранее...хотя все это не принципиально.
Решение задачи: «Формирование списка файлов с последующей упаковкой в архив»
textual
Листинг программы
- Option Explicit
- ' Alex Averchenkoff принадлежит оригинальный код BAT программы MakeCab.
- ' Dragokas перевел программу на язык Visual Basic 6.
- ' Dark_Timur исправил и дополнил программу.
- ' Версия: 1.1
- Function CreateCab(Source As String, SourceType As String, ArchName As String, Destination As String, Compress As Boolean, _
- CompressLvl As Byte, SubFolders As Boolean, Ext As String, SFX As Boolean, Silent As Boolean) As Long
- Dim AddData As String, DDF As String
- If LCase(SourceType) = "d" Or LCase(SourceType) = "dir" Or LCase(SourceType) = "directory" Then
- AddData = GetData(Source, True, LCase(Ext), Silent)
- ElseIf LCase(SourceType) = "f" Or LCase(SourceType) = "file" Then
- AddData = """" & Source & """" & vbCrLf
- Else
- If Not Silent Then MsgBox "Неправильно задан тип исходных данных", vbCritical
- CreateCab = 272
- End Function
- End If
- If (Err <> 0) Then Exit Function
- DDF = GetTempFile() 'DDF будет во временной папке Windows
- CreateDDF DDF, ArchName, AddData, Destination, IIf(Compress, "ON", "OFF"), CompressLvl
- With CreateObject("WScript.Shell")
- CreateCab = .Run("makecab.exe /F " & DDF, 0, True)
- If (CreateCab <> 0) Then
- If Not Silent Then MsgBox "Ошибка создания архива (" & CreateCab & ")", vbCritical
- Exit Function
- End If
- If SFX Then 'Превращаем обычный архив в SFX
- .Run "cmd /x /c ""copy /b """ & Environ("windir") & "\system32\extrac32.exe""+""" & _
- Destination & "\" & ArchName & ".cab"" """ & Destination & "\" & ArchName & ".exe""""", 0, True
- Kill Destination & "\" & ArchName & ".cab"
- End If
- End With
- Call Clear(DDF)
- If Not Silent Then MsgBox "Готово.", vbInformation
- End Function
- Function GetData(fold As String, SubFolders As Boolean, Ext As String, Silent As Boolean) As String
- On Error Resume Next 'Пропуск папок/файлов, защищенных правами
- Dim myfiles As Object, mydirs As Object
- Dim fil As Object, dir As Object
- With CreateObject("Scripting.FileSystemObject").GetFolder(fold)
- Set myfiles = .Files
- Set mydirs = .SubFolders
- End With
- For Each fil In myfiles
- If Trim(Ext) = "*" Or Trim(Ext) = "*.*" Or Trim(Ext) = "" Or (LCase(Right(fil.Name, Len(Ext)))) = Ext Then
- GetData = GetData & """" & fil.Path & """" & vbCrLf
- End If
- Next
- If SubFolders Then
- For Each dir In mydirs
- GetData = GetData & ".Set DestinationDir=" & Chr(34) & dir.Name & Chr(34) & vbCrLf & _
- GetData(dir.Path, True, Ext, Silent) & vbCrLf
- Next
- End If
- GetData = Left(GetData, Len(GetData) - 2) 'CrLf
- Set myfiles = Nothing: Set mydirs = Nothing
- End Function
- Function GetTempFile() 'Получить временный незанятый файл
- Dim FSO As Object, FN As String
- Set FSO = CreateObject("Scripting.FileSystemObject")
- FN = FSO.GetTempName()
- FN = Environ("temp") & "\" & FN
- If dir(FN) <> vbNullString Then FN = GetTempFile()
- GetTempFile = FN
- Set FSO = Nothing
- End Function
- Function CreateDDF(DDF$, ArchName, GetData$, Out, SetCom As String, SetComLvl As Byte)
- Dim ff As Integer
- ff = FreeFile()
- 'Подготовим DDF-файл ответов для архиватора CAB
- Open DDF For Output As #ff
- Print #ff, ".Set CabinetNameTemplate=" & ArchName & ".cab"
- Print #ff, ".Set CompressionType=MSZIP"
- Print #ff, ".Set MaxDiskSize=CDROM"
- Print #ff, ".Set ReservePerCabinetSize=6144"
- Print #ff, ".Set Compress=" & SetCom
- Print #ff, ".Set CompressionMemory=21"
- Print #ff, ".Set DiskDirectoryTemplate=""."""
- Print #ff, ".Set Cabinet=ON"
- Print #ff, ".Set UniqueFiles=ON"
- If LCase(SetCom) = "on" Then Print #ff, ".Set CompressionLevel=" & CStr(SetComLvl)
- Print #ff, ".Set DiskDirectory1=" & Out
- Print #ff, GetData
- Close #ff
- End Function
- Sub Clear(DDF$)
- On Error Resume Next
- Kill Environ("temp") & "\setup.inf"
- Kill Environ("temp") & "\setup.rpt"
- Kill DDF
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д