1302 / 508 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
1

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

20.02.2014, 22:27. Показов 9876. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2014, 22:27
Ответы с готовыми решениями:

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

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

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

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

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

Создать архив надо вручную, ПКМ - создать архив и т.п.
Потом его поместить в ресурсы приложения.
А когда надо, сохранять на диск
2
4 / 4 / 0
Регистрация: 18.02.2014
Сообщений: 49
21.02.2014, 10:28 5
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
1707 / 1195 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
21.02.2014, 12:05 6
Лучший ответ Сообщение было отмечено Серж_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
1302 / 508 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
21.02.2014, 17:57  [ТС] 7
Спасибо большое. Теперь все прекрасно работает
0
Почетный модератор
21374 / 9108 / 1082
Регистрация: 11.04.2010
Сообщений: 11,014
21.02.2014, 21:14 8
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 байт.
Запаковать файл в .zip архивы (Создание пустого файла архива)


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

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

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

(Windows XP Home Edition SP 2)
0
1302 / 508 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
21.02.2014, 21:33  [ТС] 11

Не по теме:

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



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

Добавлено через 3 минуты
Для тех, у кого 4.5, можно попробовать это: http://msdn.microsoft.com/ru-r... 10%29.aspx
0
1707 / 1195 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
22.02.2014, 02:16 15
Цитата Сообщение от Памирыч Посмотреть сообщение
Под семеркой работает, под XP - нет. Вот такие пирожки
Хы, прикольно. У меня под семеркой тестировалось.
А что ему, интересно, в ХР мешает...
0
4 / 4 / 0
Регистрация: 18.02.2014
Сообщений: 49
22.02.2014, 08:34 16
Сторонними dll религия не позволяет пользоваться?) У меня в примере Ionic, работает и под 7, и под ХР. И кода поменьше будет, и вес дополнительный небольшой.. Смысл этих танцев с бубном?
0
1302 / 508 / 63
Регистрация: 09.08.2012
Сообщений: 2,056
22.02.2014, 09:25  [ТС] 17
Цитата Сообщение от LiverDeliver Посмотреть сообщение
Сторонними dll религия не позволяет пользоваться?
Я ими никогда н пользовалмя ранее. Да и смысл, если в FAQ есть код рабочий, зачем лишний раз тягать за программой библиотеку
Цитата Сообщение от LiverDeliver Посмотреть сообщение
Смысл этих танцев с бубном?
В итоге сделал с dll подключаемой, Памирыч показал, смотрите:
https://www.cyberforum.ru/post5813460.html
0
4 / 4 / 0
Регистрация: 18.02.2014
Сообщений: 49
22.02.2014, 09:39 18
Те же яйца, только dll другая)
P.s.: Ionic тоже бесплатная. (не реклама)
Ну, главное что работает как надо)
0
1707 / 1195 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
22.02.2014, 11:38 19
может, в разных версиях форточек версия shell32.dll отличается? Если не забуду, в понедельник попробую на машинах с ХР.
0
1483 / 578 / 106
Регистрация: 26.03.2012
Сообщений: 1,023
24.02.2014, 12:31 20
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2014, 12:31
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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