Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/56: Рейтинг темы: голосов - 56, средняя оценка - 5.00
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056

Запаковать файл в .zip архивы (Создание пустого файла архива)

20.02.2014, 22:27. Показов 11013. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Нужно архивировать файлы с каталога (запаковать)
Как заорхивировать я знаю (в FAQ есть )
Проблема в том, что файл с расширением .zip должен быть на диске. В этом и проблема, т.к.:
1) Если его создать как-нибудь так File.Create("D:\архив.zip") то это не архив по сути и программа ругается (битый файл)
2) Пустой архив без файла даже вручную создать не получится, в нем обязательно должен лежать хоть один файл, а он мне не к чему
Как быть? В поиске форума вопросы хоть и были такие но никто ответ не дал на них.
Вот сам код, который сейчас использую:
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
Dim sh As New Shell32.Shell()
        Dim input As Shell32.Folder = sh.NameSpace("D:\Temp")
        Dim output As Shell32.Folder = sh.NameSpace("D:\Архив.zip")  'этот файл как пустой создать чтобы его можно было использовать (не битый)
        output.CopyHere(input.Items, 4)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2014, 22:27
Ответы с готовыми решениями:

Извлечь из zip архива определенную папку. Запаковать ее в другой архив
Есть два zip архива, одинакового содержимого. Нужно из первого архива извлечь определенную папку, например с названием "RES" и...

Как с использованием 7-Zip запаковать файлы и каталоги в архив и распаковать их из архива?
Научите меня 7z паковать! Документация выводится в консоль, но всё же пробами и ошибками долго изучать. Меня интересует как можно...

Запаковать файл в архив (.zip)
необходимо запаковать файлы, путь к папке, в которой лежат файлы берется из текстового поля. пример, который указан в FAQ у меня не...

22
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
21.02.2014, 06:29
emenem97, самое простое - создать такой архив и поместить в ресурсы приложения, при необходимости - выгружать на диск и дописывать уже кодом, который
Цитата Сообщение от emenem97 Посмотреть сообщение
я знаю
0
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
21.02.2014, 07:12  [ТС]
Цитата Сообщение от Памирыч Посмотреть сообщение
создать такой архив
Утро доброе Создать архив пустой не получается создать, я же писал. Придется положить в него какой-либо файл, чтобы архив существовать.
Может я Вас не правильно понимаю?
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
21.02.2014, 07:56
emenem97, привет.
Цитата Сообщение от emenem97 Посмотреть сообщение
Может я Вас не правильно понимаю?
Неа, неправильно)

Создать архив надо вручную, ПКМ - создать архив и т.п.
Потом его поместить в ресурсы приложения.
А когда надо, сохранять на диск
2
4 / 4 / 0
Регистрация: 18.02.2014
Сообщений: 49
21.02.2014, 10:28
emenem97, я пользуюсь Ionic.Zip.Reduced.dll

VB.NET
1
2
3
4
      Using zip As New ZipFile
                zip.AddFile(Application.StartupPath & "\Logs.txt", "")
                zip.Save("Path" & "\Logs.zip") ' при совпадении перезапишет. Возможна потеря данных!!
            End Using
может подойдет)
2
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
21.02.2014, 12:05
Лучший ответ Сообщение было отмечено Серж_87 как решение

Решение

Цитата Сообщение от emenem97 Посмотреть сообщение
Как заорхивировать я знаю
Ну конечно, пример этот
и там написано
Объекты output должны быть предварительно созданы: при распаковке - пустая папка в которую будем распаковывать, а при упаковке - пустой файл (желательно с расширением zip)
но вот беда -
метод IO.File.Create (путь) - создает пустой файл, но после создания держит его открытым в монопольном режиме. Созданный поток надо закрыть перед использованием (ifs.Close()):
VB.NET
1
2
3
4
5
6
7
8
Sub Zip()
        Dim sh As New Shell32.Shell()
        Dim input As Shell32.Folder = sh.NameSpace("D:\Должностные инструкции")
        Dim ifs As IO.FileStream = IO.File.Create("d:\архив.zip")
        ifs.Close()
        Dim output As Shell32.Folder = sh.NameSpace("d:\архив.zip")
        output.CopyHere(input.Items, 4)
    End Sub
И распаковка
VB.NET
1
2
3
4
5
6
7
Sub UnZip()
        Dim sh As New Shell32.Shell()
        IO.Directory.CreateDirectory("d:\новая папка")
        Dim output As Shell32.Folder = sh.NameSpace("d:\новая папка")
        Dim input As Shell32.Folder = sh.NameSpace("d:\архив.zip")
        output.CopyHere(input.Items, 4)
    End Sub
К сожалению, это такая досадная мелочь, не указанная в примере. теперь исправленная

Добавлено через 1 минуту
Цитата Сообщение от emenem97 Посмотреть сообщение
это не архив по сути и программа ругается (битый файл)
она ругается не на битый файл, а на то, что он открытым остается к моменту записи в него содержимого архива
2
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
21.02.2014, 17:57  [ТС]
Спасибо большое. Теперь все прекрасно работает
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
21.02.2014, 21:14
VB.NET
1
2
3
4
5
6
7
8
Sub Zip()
 Dim sh As New Shell32.Shell()
 Dim input As Shell32.Folder = sh.NameSpace("D:\Должностные инструкции")
 Dim ifs As IO.FileStream = IO.File.Create("d:\архив.zip")
 ifs.Close()
 Dim output As Shell32.Folder = sh.NameSpace("d:\архив.zip")
 output.CopyHere(input.Items, 4)
 End Sub
Что-то решил попробовать, но ИМХО, все-таки этому зип-архиверу не нравится созданный файл в 0 байт.


Если я создаю архив сам и комментирую часть кода, отвечающую за создание пустого файла, все работает.

Что-то тут не чисто
0
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
21.02.2014, 21:19  [ТС]
Imports System
Imports System.IO
Не забыли вписать? У меня успешно работает и пакует файлы
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
21.02.2014, 21:25
Цитата Сообщение от emenem97 Посмотреть сообщение
Не забыли вписать?
Они подключены по умолчанию. Код-то в редакторе ошибок не выдает - ведь я не смог бы его вообще запустить, если б чего-то из вышеперечисленного не хватало.

Цитата Сообщение от emenem97 Посмотреть сообщение
У меня успешно работает и пакует файлы
Значит, есть какая-то разница (может, в виндах или коде)
Но факт остается фактом - код с подвохом...
Еще бы кто проверил

(Windows XP Home Edition SP 2)
0
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
21.02.2014, 21:33  [ТС]

Не по теме:

У меня Windows 7 Максимальная 64-битная
работает



Добавлено через 6 минут
и в VS 2008 и VS 2010 Express работает
Цитата Сообщение от Памирыч Посмотреть сообщение
NameSpace("D:\Должностные инструкции")
Вы имя файла без расширения указали. У меня без расширения ошибка архивации...
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
21.02.2014, 21:40
Цитата Сообщение от emenem97 Посмотреть сообщение
имя файла без расширения указали
Разве это не папка?
0
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
21.02.2014, 21:43  [ТС]
Да папка, это я ошибъся, сам уже забыл что архивирую. Извиняюсь
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
21.02.2014, 21:55
Под семеркой работает, под XP - нет. Вот такие пирожки

Добавлено через 3 минуты
Для тех, у кого 4.5, можно попробовать это: http://msdn.microsoft.com/ru-r... 10%29.aspx
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
22.02.2014, 02:16
Цитата Сообщение от Памирыч Посмотреть сообщение
Под семеркой работает, под XP - нет. Вот такие пирожки
Хы, прикольно. У меня под семеркой тестировалось.
А что ему, интересно, в ХР мешает...
0
4 / 4 / 0
Регистрация: 18.02.2014
Сообщений: 49
22.02.2014, 08:34
Сторонними dll религия не позволяет пользоваться?) У меня в примере Ionic, работает и под 7, и под ХР. И кода поменьше будет, и вес дополнительный небольшой.. Смысл этих танцев с бубном?
0
 Аватар для Серж_87
1303 / 509 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
22.02.2014, 09:25  [ТС]
Цитата Сообщение от LiverDeliver Посмотреть сообщение
Сторонними dll религия не позволяет пользоваться?
Я ими никогда н пользовалмя ранее. Да и смысл, если в FAQ есть код рабочий, зачем лишний раз тягать за программой библиотеку
Цитата Сообщение от LiverDeliver Посмотреть сообщение
Смысл этих танцев с бубном?
В итоге сделал с dll подключаемой, Памирыч показал, смотрите:
https://www.cyberforum.ru/post5813460.html
0
4 / 4 / 0
Регистрация: 18.02.2014
Сообщений: 49
22.02.2014, 09:39
Те же яйца, только dll другая)
P.s.: Ionic тоже бесплатная. (не реклама)
Ну, главное что работает как надо)
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
22.02.2014, 11:38
может, в разных версиях форточек версия shell32.dll отличается? Если не забуду, в понедельник попробую на машинах с ХР.
0
 Аватар для PAnT0P
1492 / 587 / 106
Регистрация: 26.03.2012
Сообщений: 1,039
24.02.2014, 12:31
VB.NET
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
Imports System.IO
Imports Shell32
 
Module vbZip
    Private Const FOF_MULTIDESTFILES As Int32 = 1               '
    Private Const FOF_CONFIRMMOUSE As Int32 = 2                 '
    Private Const FOF_SILENT As Int32 = 4                       'Не отображать диалоговое окно процесса.
    Private Const FOF_RENAMEONCOLLISION As Int32 = 8            'Дать файлу новое имя при операции перемещения, копирования или переименовывания, если файл с целевым именем уже существует.
    Private Const FOF_NOCONFIRMATION As Int32 = 16              'Ответ «Да для всех» для любого диалогового окна, которое отобразится.
    Private Const FOF_WANTMAPPINGHANDLE As Int32 = 32           '
    Private Const FOF_ALLOWUNDO As Int32 = 64                   'Сохранить информацию для отмены, если это возможно.
    Private Const FOF_FILESONLY As Int32 = 128                  'Выполнять операции только с файлами, если маска файла (*.*) не указана.
    Private Const FOF_SIMPLEPROGRESS As Int32 = 256             'Показать диалоговое окно процесса, но не показывать имен файлов.
    Private Const FOF_NOCONFIRMMKDIR As Int32 = 512             'Не подтверждать создание новой папки.
    Private Const FOF_NOERRORUI As Int32 = 1024                 'Не отображать пользовательский интерфейс, если произошла ошибка.
    Private Const FOF_NOCOPYSECURITYATTRIBS As Int32 = 2048     'Версия 4.71. Не копировать атрибуты безопасности файлов.
    Private Const FOF_NORECURSION As Int32 = 4096               'Исключить вложеные папки из обработки.
    Private Const FOF_NO_CONNECTED_ELEMENTS As Int32 = 8192     'Версия 5.0. Не копировать файлы связанные в группы. Копировать только указанные файлы.
    Private Const FOF_WANTNUKEWARNING As Int32 = 16384          '
 
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Folder - Папка, которую хотим упаковать C:\Test
    ' ZipFile - Путь к архиву в который хотим упаковать C:\Test.zip
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Result -  Результат обработки
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Function Zip(ByVal Folder As String, ByVal ZipFile As String) As Boolean
        Dim Result As Boolean
        Dim ZipHeader As Byte() = New Byte() {80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        Dim fs As FileStream = File.Create(ZipFile)
        fs.Write(ZipHeader, 0, ZipHeader.Length)
        fs.Flush()
        fs.Close()
        fs = Nothing
        Dim sh As New Shell32.Shell()
        Dim input As Shell32.Folder = sh.NameSpace(Folder)
        Dim output As Shell32.Folder = sh.NameSpace(ZipFile)
        Try
            output.CopyHere(input.Items, FOF_SILENT + FOF_NOERRORUI)
            Result = True
        Catch
            Result = False
        End Try
        Return Result
    End Function
 
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Folder - Папка в которую хотим распаковать C:\Test (папка должена существовать)
    ' ZipFile - Путь к архиву из которого всё будет извлечено C:\Test.zip
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Result -  Результат обработки
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Function UnZip(ByVal ZipFile As String, Folder As String) As Boolean
        Dim Result As Boolean
        Dim UnZipFiles() As IO.FileInfo
        Dim Tmp As New IO.DirectoryInfo(Folder)
        Dim Files As New ArrayList
        Dim sh As New Shell32.Shell()
        Dim output As Shell32.Folder = sh.NameSpace(Folder)
        Dim input As Shell32.Folder = sh.NameSpace(ZipFile)
        Try
            output.CopyHere(input.Items, FOF_SILENT + FOF_NOERRORUI)
            Result = True
        Catch
            Result = False
        End Try
        Return Result
    End Function
    
End Module
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2014, 12:31
Помогаю со студенческими работами здесь

Как распаковать файл из архива внутри архива? Ionic.Zip
Всем привет! Пишу программу для распаковки файла "Main.xml" в ZIP архиве "Test2" в ZIP архиве "Test". Для лучшего понимание...

Создание пустого архива Winrar
Как по нажатию на кнопку создать пустой архив ? Будь то рар или зип, не имеет значения.

Создание архива (ZIP)
Доброго времени суток, Если кто-то знает, как в VBS проводить архивацию папок в zip, подскажите, пожалуйста :) Мой поиск был...

Создание ZIP архива
Есть несколько xml файлов. Надо их засунуть в 1 архив. Есть-ли подходящая либа на плюсах? Про zlib знаю, но не очень бы хотелось писать...

Создание ZIP архива
У меня есть несколько папок с файлами, надо из каждой папки создать ZIP архив. Как это сделать? Добавлено через 1 час 9 минут Мне...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru