Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32

Запаковывание в архив средствами Windows

16.05.2013, 20:11. Показов 1865. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нашел в Интернете нужную мне функцию запаковывания файла/папки в zip архив.

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
Option Explicit
 
Private Sub Command1_Click()
 
    CreateEmptyZip "c:\testzip.zip"
    
    With CreateObject("Shell.Application")
        .NameSpace("c:\testzip.zip").CopyHere "c:\test.txt" 'используйте это для запаковывания файла
        ' .NameSpace("c:\testzip.zip").CopyHere .NameSpace(FolderName).items 'используйте это для запаковывания папки
    End With
    ' All done!
End Sub
 
 
Public Sub CreateEmptyZip(sPath)
    Dim strZIPHeader As String
    
    strZIPHeader = Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) 'header zip файла
    With CreateObject("Scripting.FileSystemObject")
        .CreateTextFile(sPath).Write strZIPHeader 'записываем header в пустой файл
    End With
    
End Sub
Сделал функцию создания zip архива ( CreateEmptyZip в программе есть ):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Function CreateZip(SourcePath As String, ZipPath As String, ZipMode As String)
 
    CreateEmptyZip ZipPath
    
    With CreateObject("Shell.Application")
       If LCase(ZipMode) = "f" Or LCase(ZipMode) = "file" Then 'если файл, то
        .NameSpace(ZipPath).CopyHere SourcePath 'зипуем как файл
       ElseIf LCase(ZipMode) = "d" Or LCase(ZipMode) = "dir" Or LCase(ZipMode) = "directory" Then 'если папка, то
        .NameSpace(ZipPath).CopyHere .NameSpace(SourcePath).items 'зипуем как папку
       End If
    End With
    
End Function
1 код работает нормально, но мой код вылетает с ошибкой:
run-time error 91 object variable or with block variable not set
Вылетает программа с ошибкой в момент зипования.

Помогите пожалуйста найти ошибку.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2013, 20:11
Ответы с готовыми решениями:

Возможно ли средствами VB 6 Упаковать файлы в архив с паролем, а также распаковать?
Возможно ли средствами VB 6 Упаковать файлы в архив с паролем, а также распаковать?

Криптование стрингов (файлов) средствами Windows?
возможно ли каким-то хитрым образом делать криптование (желательно как само криптование, так и обратный процесс) средствами самого...

Распаковать архив средствами BAT
Уважаемые друзья . На днях столкнулся с проблемой которую без Вашей помощи никак не решить. Нужно сделать bat файл примерно так....

4
2041 / 473 / 131
Регистрация: 13.11.2008
Сообщений: 902
16.05.2013, 20:48
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Какие параметры в функцию передаете?

Т.к. Shell более-менее капризный, то возможно необходимо приведение типов непосредственно внутри:
Code
1
.NameSpace(CStr(ZipPath)).CopyHere CStr(SourcePath)
Это если все параметры переданы в функцию верно и просто ну нет никаких других мыслей.
2
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32
17.05.2013, 15:24  [ТС]
.NameSpace(CStr(ZipPath)).CopyHere CStr(SourcePath)
Вот уж не ожидал, что поможет. Теперь все работает как часы.

Дабы не создавать новую тему, хочу спросить: Если архивировать много информации, то открывается окно с информацией о том, сколько осталось времени. Можно ли как-то его убрать?

Добавлено через 25 минут
UPD, разобрался. Нашел в MSDN информацию о флагах операции CopyHere
0
57 / 4 / 1
Регистрация: 03.01.2013
Сообщений: 32
01.06.2013, 14:55  [ТС]
Спустя полмесяца решил снова пришел снова к этой функции. Добавил возможность добавлять флаги. Не смог организовать ожидание завершения архивации, добавил в функцию возможность удаления исходного файла/папки (дабы можно было проверить, завершена архивация или нет. Получилось так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function CreateZip(SourcePath As String, ZipPath As String, ZipMode As String, Flags As Long, DelSource As Boolean)
 
    CreateEmptyZip ZipPath
    
    With CreateObject("Shell.Application")
       If LCase(ZipMode) = "f" Or LCase(ZipMode) = "file" Then
        If DelSource Then
         .NameSpace(CStr(ZipPath)).MoveHere CStr(SourcePath), CLng(Flags)
        ElseIf Not DelSource Then
         .NameSpace(CStr(ZipPath)).CopyHere CStr(SourcePath), CLng(Flags)
        End If
       ElseIf LCase(ZipMode) = "d" Or LCase(ZipMode) = "dir" Or LCase(ZipMode) = "directory" Then
        If DelSource Then
         .NameSpace(CStr(ZipPath)).MoveHere .NameSpace(CStr(SourcePath)).Items, CLng(Flags)
        ElseIf Not DelSource Then
         .NameSpace(CStr(ZipPath)).CopyHere .NameSpace(CStr(SourcePath)).Items, CLng(Flags)
        End If
       End If
    End With
End Function
Функция на половину рабочая (ниже объясню, почему), но некрасивая. Решил я ее чуть-чуть упростить.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function CreateZip(SourcePath As String, ZipPath As String, ZipMode As String, Flags As Long, DelSource As Boolean)
    Dim Here
    CreateEmptyZip ZipPath
    
    
    With CreateObject("Shell.Application")
     If LCase(ZipMode) = "f" Or LCase(ZipMode) = "file" Then
      Here = CStr(SourcePath)
     ElseIf LCase(ZipMode) = "d" Or LCase(ZipMode) = "dir" Or LCase(ZipMode) = "directory" Then
      Here = .NameSpace(CStr(SourcePath)).Items
     End If
     
     If DelSource Then
      .NameSpace(CStr(ZipPath)).MoveHere Here, CLng(Flags)
     ElseIf Not DelSource Then
      .NameSpace(CStr(ZipPath)).CopyHere Here, CLng(Flags)
     End If
    End With
    
End Function
Функция не работает. Я во всем подозреваю переменную Here. По идее, ее надо объявлять как FolderItems3 или как String (в зависимости оттого, что надо архивировать, так как:

Visual Basic
1
2
3
4
5
TypeName(CreateObject("Shell.Application").NameSpace(CStr(Любая папка)).Items)[/CODE]
 
Возвращает FolderItems3, а
 
[CODE]TypeName(Cstr(Любой путь к файлу))
Возвращает String.
Однако, тут: http://www.script-coding.com/WSH/Shell.html#4.3.2. написано, что:

CopyHere(<Путь>,<Опции>)
Visual Basic
1
<Путь> - полный путь к копируемому файлу или папке (строка) или объект FolderItem.
Если же оставить Here Variantом, а потом на выходе архивации папки узнать, что за переменная Here, то выдаст FolderItemVerbs.

Прикол в том, что Here нельзя просто так объявить ни FolderItems3, ни FolderItem, ни FolderItemVerbs. Выдает ошибку.

Чуть не забыл объяснить, почему 1 функция наполовину рабочая. Дело в том, что если использовать первую функцию и добавить такой код:

Visual Basic
1
2
3
4
5
With CreateObject("Scripting.FileSystemObject")
  .CreateFolder Environ("Temp") & "\TestZip" 'Создаем папку
  .CreateTextFile(Environ("Temp") & "\TestZip\Bigfile.txt").Write String(2 ^ 24, 255) 'Кладем туда немаленький файл
  CreateZip Environ("Temp") & "\TestZip", Environ("Temp") & "testzip.zip", "Dir", 4 + 8 + 1024, True 'Архивируем.
 End With
И выполнить всё это в самой среде Visual Basic 6 (то есть нажать Запуск -> Запуск с полной компиляцией), то все будет нормально работать. Если же компилировать программу и запустить ее, то архив будет создан, но файлы туда не будут копированы. Если же в самый конец функции добавить Msgbox или Inputbox с любым текстом и компилировать программу, то она (программа) будет нормально работать.

Ух, все, описал свою проблему. Если честно, сам не ожидал такой нестабильности.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
01.06.2013, 17:30
В Cabinet архив, если интересно: Формирование списка файлов с последующей упаковкой в архив
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.06.2013, 17:30
Помогаю со студенческими работами здесь

Screenshot из Windows Media Player средствами .NET или API Windows
Здравствуйте! Запарился искать в Инете, решил попробовать здесь спросить. Есть небольшой собственный проигрыватель написанный на C# с...

Архив curl для windows 64 bit
Добрый день, есть ли у кого нибудь архив с курлом для 64 битной винды? Столкнулась с проблемой что не качает ни с одного сайта этот архив,...

Открыть архив в Windows, сделанный на MacOS
Добрый день. Открываю архив с мака, в названиях файлов и папок иероглифы, содержимое самих файлов нормальное. (внутри архива структура...

Как открыть архив DB? Не база данных, а архив с документами
Подскажите, как можно открыть файл .DB? Файл запаролен и не открывается ни парадоксом, ни дельфи. ТОчно уверен, что это архив.

Упаковка в архив (с использованием пароля на архив) и отправка по почте
Помогите с написанием макроса, который будет упаковывать книгу в архив (книга по-умолчанию сохраняется в одну и ту же директорию),...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru