Формирование списка файлов с последующей упаковкой в архив - VB

Узнай цену своей работы

Формулировка задачи:

Подскажите код для формирование списка файлов с последующей упаковкой в архив. Тип файлов не важен, например /txt. Возможно ли решать эту задачу если на пк пользователя нет архиватора. Желательно, чтобы прога запускалась по нажатию на кнопку. Тип файла и место конечного архива указаны заранее...хотя все это не принципиально.

Решение задачи: «Формирование списка файлов с последующей упаковкой в архив»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. ' Alex Averchenkoff принадлежит оригинальный код BAT программы MakeCab.
  4. ' Dragokas перевел программу на язык Visual Basic 6.
  5. ' Dark_Timur исправил и дополнил программу.
  6. ' Версия: 1.1
  7.  
  8. Function CreateCab(Source As String, SourceType As String, ArchName As String, Destination As String, Compress As Boolean, _
  9.  CompressLvl As Byte, SubFolders As Boolean, Ext As String, SFX As Boolean, Silent As Boolean) As Long
  10.  
  11.  Dim AddData As String, DDF As String
  12.  
  13.  If LCase(SourceType) = "d" Or LCase(SourceType) = "dir" Or LCase(SourceType) = "directory" Then
  14.   AddData = GetData(Source, True, LCase(Ext), Silent)
  15.  ElseIf LCase(SourceType) = "f" Or LCase(SourceType) = "file" Then
  16.   AddData = """" & Source & """" & vbCrLf
  17.  Else
  18.   If Not Silent Then MsgBox "Неправильно задан тип исходных данных", vbCritical
  19.   CreateCab = 272
  20.   End Function
  21.  End If
  22.  
  23.  If (Err <> 0) Then Exit Function
  24.  DDF = GetTempFile() 'DDF будет во временной папке Windows
  25. CreateDDF DDF, ArchName, AddData, Destination, IIf(Compress, "ON", "OFF"), CompressLvl
  26.  
  27.  With CreateObject("WScript.Shell")
  28.  
  29.   CreateCab = .Run("makecab.exe /F " & DDF, 0, True)
  30.   If (CreateCab <> 0) Then
  31.    If Not Silent Then MsgBox "Ошибка создания архива (" & CreateCab & ")", vbCritical
  32.    Exit Function
  33.   End If
  34.  
  35.   If SFX Then 'Превращаем обычный архив в SFX
  36.   .Run "cmd /x /c ""copy /b """ & Environ("windir") & "\system32\extrac32.exe""+""" & _
  37.      Destination & "\" & ArchName & ".cab"" """ & Destination & "\" & ArchName & ".exe""""", 0, True
  38.    Kill Destination & "\" & ArchName & ".cab"
  39.   End If
  40.  
  41.  End With
  42.    
  43.  Call Clear(DDF)
  44.  If Not Silent Then MsgBox "Готово.", vbInformation
  45. End Function
  46.  
  47. Function GetData(fold As String, SubFolders As Boolean, Ext As String, Silent As Boolean) As String
  48. On Error Resume Next 'Пропуск папок/файлов, защищенных правами
  49. Dim myfiles As Object, mydirs As Object
  50.  Dim fil As Object, dir As Object
  51.  
  52.  With CreateObject("Scripting.FileSystemObject").GetFolder(fold)
  53.   Set myfiles = .Files
  54.   Set mydirs = .SubFolders
  55.  End With
  56.  
  57.  For Each fil In myfiles
  58.   If Trim(Ext) = "*" Or Trim(Ext) = "*.*" Or Trim(Ext) = "" Or (LCase(Right(fil.Name, Len(Ext)))) = Ext Then
  59.    GetData = GetData & """" & fil.Path & """" & vbCrLf
  60.   End If
  61.  Next
  62.  
  63.  If SubFolders Then
  64.   For Each dir In mydirs
  65.    GetData = GetData & ".Set DestinationDir=" & Chr(34) & dir.Name & Chr(34) & vbCrLf & _
  66.     GetData(dir.Path, True, Ext, Silent) & vbCrLf
  67.   Next
  68.  End If
  69.  
  70.  GetData = Left(GetData, Len(GetData) - 2) 'CrLf
  71. Set myfiles = Nothing: Set mydirs = Nothing
  72. End Function
  73.  
  74. Function GetTempFile() 'Получить временный незанятый файл
  75. Dim FSO As Object, FN As String
  76.    
  77.  Set FSO = CreateObject("Scripting.FileSystemObject")
  78.    
  79.  FN = FSO.GetTempName()
  80.  FN = Environ("temp") & "\" & FN
  81.    
  82.  If dir(FN) <> vbNullString Then FN = GetTempFile()
  83.  
  84.  GetTempFile = FN
  85.  Set FSO = Nothing
  86. End Function
  87.  
  88. Function CreateDDF(DDF$, ArchName, GetData$, Out, SetCom As String, SetComLvl As Byte)
  89.  Dim ff As Integer
  90.  ff = FreeFile()
  91.  
  92.  'Подготовим DDF-файл ответов для архиватора CAB
  93. Open DDF For Output As #ff
  94.    
  95.  Print #ff, ".Set CabinetNameTemplate=" & ArchName & ".cab"
  96.  Print #ff, ".Set CompressionType=MSZIP"
  97.  Print #ff, ".Set MaxDiskSize=CDROM"
  98.  Print #ff, ".Set ReservePerCabinetSize=6144"
  99.  Print #ff, ".Set Compress=" & SetCom
  100.  Print #ff, ".Set CompressionMemory=21"
  101.  Print #ff, ".Set DiskDirectoryTemplate=""."""
  102.  Print #ff, ".Set Cabinet=ON"
  103.  Print #ff, ".Set UniqueFiles=ON"
  104.  If LCase(SetCom) = "on" Then Print #ff, ".Set CompressionLevel=" & CStr(SetComLvl)
  105.  Print #ff, ".Set DiskDirectory1=" & Out
  106.  Print #ff, GetData
  107.  Close #ff
  108.  
  109. End Function
  110.  
  111. Sub Clear(DDF$)
  112. On Error Resume Next
  113.  Kill Environ("temp") & "\setup.inf"
  114.  Kill Environ("temp") & "\setup.rpt"
  115.  Kill DDF
  116. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы