0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 68
1

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

26.01.2013, 02:14. Показов 3291. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите код для формирование списка файлов с последующей упаковкой в архив.
Тип файлов не важен, например /txt.
Возможно ли решать эту задачу если на пк пользователя нет архиватора.
Желательно, чтобы прога запускалась по нажатию на кнопку.
Тип файла и место конечного архива указаны заранее...хотя все это не принципиально.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2013, 02:14
Ответы с готовыми решениями:

Вывод списка файлов с последующей сортировкой
Доброго времени суток. Нужна помощь в доработке одного скрипта. (говорю сразу, в php я новичок) ...

Формирование списка файлов
День добрый! Существует такая иерархия: На диске С лежит папка In, в нее закидываются папки вида...

Формирование списка из имен файлов
Здравствуйте. Есть папка с файлами, их около 200 (пример:...

SFX-архив разрезать для последующей склейки и выполнения
Есть EXE (SFX-архив) ~950 Мб можно ли его как то разбить например на: 199 Мб + 199 Мб + 199 Мб +...

4
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
26.01.2013, 05:42 2
Лучший ответ Сообщение было отмечено как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Option Explicit
 
Private Sub Command1_Click()
    Const BIF_RETURNONLYFSDIRS = 1&
    Dim FSO As Object, FilesList As String, DDF As String, Root As Object, Ext As String, SFX As Boolean
    Dim ff As Integer, ArchName As String, Ret, Output As String
    
    '// Архив создадим на рабочем столе
    Output = CreateObject("WScript.Shell").SpecialFolders("Desktop")
    
    Dim WshFolder As Object
    Set WshFolder = CreateObject("Shell.Application").BrowseForFolder(Me.hWnd, "Select a Folder", BIF_RETURNONLYFSDIRS)
 
    Ext = InputBox("Введите расширение для архивируемых файлов: ")
    ArchName = InputBox("Введите имя архива: ")
    SFX = IIf(MsgBox("Создать самораспаковующийся архив?", vbQuestion + vbYesNo, "CAB") = vbYes, True, False)
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Root = FSO.GetFolder(WshFolder.self.Path)
 
    Ret = GetFiles(Root, LCase(Ext), FilesList)
    If (Ret <> 0) Then Exit Sub
    
    DDF = GetTempFile() '// DDF будет во временной папке Windows
    
    Call CreateDDF(DDF, ArchName, FilesList, Output)
    
    With CreateObject("WScript.Shell")
    
        Ret = .Run("makecab.exe /F " & DDF, 0, True)
        If (Ret <> 0) Then MsgBox "Возникла ошибка при создании архива", vbCritical
    
        If SFX Then '// Магией превращаем обычный архив в самораспаковующийся :)
        
            .Run "cmd /c ""copy /b """ & Environ("windir") & "\system32\extrac32.exe""+""" & _
                Output & "\" & ArchName & ".cab"" """ & Output & "\" & ArchName & ".exe""""", 0, True
        
            Kill Output & "\" & ArchName & ".cab"
        End If
    
    End With
    
    Call Clear(DDF)
    
    Set WshFolder = Nothing: Set Root = Nothing: Set FSO = Nothing
    
    MsgBox "Готово", vbInformation
End Sub
 
Function GetFiles(fold, Ext$, FilesList$)
On Error Resume Next '// Пропуск папок//файлов, защищенных правами
    Dim myfiles As Object, fil
 
    Set myfiles = fold.Files
 
    For Each fil In myfiles
 
        If (LCase(Right(fil.Name, Len(Ext)))) = Ext Then
        
            FilesList = FilesList & """" & fil.Path & """" & vbCrLf
        
        End If
 
    Next
    
    If (Len(FilesList) = 0) Then
        MsgBox "Нет файлов, удовлетворяющих заданным условиям", vbCritical
        GetFiles = 1 '// ErrorLevel
        Exit Function
    End If
    
    FilesList = Left(FilesList, Len(FilesList) - 2) '// -CrLf
    Set myfiles = 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
 
Sub CreateDDF(DDF$, ArchName$, FilesList$, Output$)
    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=on"
        Print #ff, ".Set CompressionMemory=21"
        Print #ff, ".Set DiskDirectoryTemplate=""."""
        Print #ff, ".Set Cabinet=ON"
        Print #ff, ".Set MaxCabinetSize=999999999"
        Print #ff, ".Set CompressionLevel=7"
        Print #ff, ".Set DiskDirectory1=" & Output
        Print #ff, FilesList
    
    Close #ff
 
End Sub
 
 
Sub Clear(DDF$)
On Error Resume Next
    Kill Environ("temp") & "\setup.inf"
    Kill Environ("temp") & "\setup.rpt"
    Kill Environ("temp") & "\" & DDF
End Sub
Сделано на основе кода от Alex Averchenkoff Команда makecab, сжать файлы по маске
9
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 68
26.01.2013, 06:13  [ТС] 3
Dragokas, спасибо огромное!
Сегодня вы сильно мне помогли.

Добавлено через 2 минуты
Это просто мега программа!!!
Очень полезная вещь.
0
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32
06.06.2013, 01:00 4
Лучший ответ Сообщение было отмечено как решение

Решение

Знаю, много времени прошло, но все же я исправил и дополнил код Dragokas.

- Архивирование подпапок
- Архивирование одного файла
- Превращение Sub Command1_Click в функцию
- Исправление пары недоработок
- Тихий режим
... И прочее.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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
Вызывается архивация через функцию CreateCab.

Очень подробное описание переменных
Кликните здесь для просмотра всего текста

Source - путь до исходного файла/папки.

SourceType - тип исходных данных. Значения: "d", "dir", "directory" означают, что исходными данными является папка, а Значения: "f", "file" означают, что исходными данными является файл. Регистр значения SourceType не важен. Остальные значения завершают функцию с ошибкой 272.

ArchName - имя будущего архива без расширения. Расширение выбирается компьютером, так что смысла его вводить в ArchName нет.

Destination - путь до папки, где будет создан архив.

Compress - флаг, устанавливающий, использовать сжатие (True) или не использовать (False).

CompressLvl - если используется сжатие, то устанавливает уровень сжатия. Диопазон: 1...7 включительно. При отключенном сжатии важности не представляет.

SubFolders - если архивируется папка и там есть подпапки, то этот флаг устанавливает, архивировать подпапки (True) или не архивировать (False). При архивировании файла важности не представляет.

Ext - если архивируется папка, то устанавливает разрешенное расширение файлов для архивирования. Файлы с неправильным расширением архивированы не будут. Если вы хотите, чтоб архивировались все файлы, то оставьте переменную пустой ("") или введите звездочку ("*" или "*.*"). Также действует и на подпапки, если они архивируются. При архивировании файла важности не представляет.

SFX - устанавливает тип архива. Обычный архив с расширением CAB будет создан, если SFX = False. Иначе, если SFX = True, будет создан SFX (самораспаковывающийся) архив с расширением EXE.

Silent - включает или отключает тихий режим. Если Silent = False, то на экран будут выводиться сообщения. Иначе, если Silent = True, на экран ничего выводиться не будет.


P.S. Если после редактирования кода у вас выскакивает "Ошибка создания архива", то сделайте следующее:

1. После строки:
Visual Basic
1
CreateDDF DDF, ArchName, AddData, Destination, IIf(Compress, "ON", "OFF"), CompressLvl
Напишите:
Visual Basic
1
InputBox "","",DDF
2. Запустите получившуюся программу и дождитесь появления окна текстом.
3. Запустите командную строку (cmd)
4. Введите:
Код
MakeCab /F %Путь_до_файла%
. Где %Путь_до_файла% - это текст из пункта №2.
5. На английском будут написаны ошибки синтаксиса файла из пункта №2. Теперь строку
Visual Basic
1
InputBox "","",DDF
можно удалять.
2
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
07.06.2013, 02:48 5
Спасибо за кропотливую доработку.

30-ю строку лучше закавычить:
Visual Basic
1
CreateCab = .Run("makecab.exe /F """ & DDF & """", 0, True)
Цитата Сообщение от Dark_Timur Посмотреть сообщение
P.S. Если после редактирования кода у вас выскакивает "Ошибка создания архива", то сделайте следующее:
Можно программно вытянуть текст из консоли повторно выполнив через Exec вне Silent-режима:
В строку 32:

Visual Basic
1
2
3
4
5
6
Dim ExecObj as object
If Not Silent Then
  Set ExecObj = CreateObject("WScript.Shell").Exec("cmd /c makecab.exe /F """ & DDF & """")
  MsgBox "Ошибка создания архива (" & CreateCab & ")" & vbCrLf & ExecObj.StdOut.ReadAll(), vbCritical
  set ExecObj = Nothing
end if
0
07.06.2013, 02:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2013, 02:48
Помогаю со студенческими работами здесь

Формирование списка с остатками от деления целых чисел из исходного списка на заданное число N
люди помогите пожалуйста!!! Формирование списка с остатками от деления целых чисел из исходного...

Формирование списка, состоящего из списка самого низшего уровня
Написать программу формирования списка, состоящего из списков самого низшего уровня для заданного...

Сортировка файлов с последующей архивацией
Помогите, пожалуйста, сделать bat файл для сортировки/выборки файлов. Сам пока ещё весьма слабо в...

Дублирование вхождения каждого элемента списка One и формирование из этих значений списка Double (пояснить условие)
Здравствуйте. Вот собственно само задание: В составе программы описать функцию, которая дублирует...

Формирование списка из N первых элементов исходного списка
Предикат proc выводит первые N элементов исходного списка. Как его переделать, чтобы он не...

Формирование и просмотр списка и функция, которая изменяет каждое значение информационной части элемента списка на его квадрат
Написать программу, содержащую процедуры формирования и просмотра списка и функцию, которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru