Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11

Помогите разобраться с zip архивами.

09.09.2009, 09:36. Показов 4327. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть zip-архив, из него надо вытащить определенный файл, обработать его и запихнуть обратно, сохранив все остальные файлы. Если кому не трудно подскажите, как проще работать с архивами.

Нашел библиотеку ZLIB, но так и не смог разобраться с ней. Основная проблема как ей воспользоваться. У меня VC++ 2008 и куча файлов относящихся к ZLIB а как их подружить вместе пока не разобрался. Если у кого есть ссылка на описание этого волшебного действия, киньте пожалуйста, буду очень признателен, так как с подобными ситуациями я наверно еще не раз столкнусь.

Еще попутно пару вопросиков.
Программка, которую я пишу будет обрабатывать несколько архивов подряд, все действия однотипные и я решил их распараллелить, вопрос такой можно ли как-нибудь управлять количеством инициированных процессов. Я хочу при запуске программы передавать ей параметр, в котором будет указанно максимальное количество процессов, это что бы процессов не было больше чем процов на сервере и чтобы еще пользователям что то оставалось.
Еще вопрос который меня заинтересовал, но пока еще не начал изучать, если разные архивы будут обрабатываться параллельно в разных процессах можно ли будет писать логи в один файл, и как это лучше делать? Присвоить глобальной переменной файл логов и все процессы туда будут писать, или лучше организовать какой-нибудь вектор и туда добавлять данные логов, а по завершению всех обработок скинуть в файл. Не знаю какой из них возможен и проще осуществить.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2009, 09:36
Ответы с готовыми решениями:

помогите пожалуйста в работе с ZIP архивами
очень нужно автоматизировать распаковку zip-архива:wall:

Работа с zip-архивами.
Есть что-нибудь с открытым кодом, для упаковки/распаковки zip-архивов? Обязательно чтобы поддерживало разные степени сжатия для файлов...

Работа с zip архивами
Кто-нибудь знает хорошую библиотеку?

17
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
09.09.2009, 14:18
zlib: http://sourceforge.net/projects/libpng
zziplib: http://sourceforge.net/projects/zziplib

zlib - это только компрессор.
Для работы с архивами нужна другая библиотека - например zziplib.

Можно использовать библиотеку и работать с архивом через нее.
Или есть другой способ - можно вызывать какой-нибудь архиватор - например infozip zip & unzip (http://www.info-zip.org/).
Или использовать архиватор 7z (http://www.7-zip.org/).

я решил их распараллелить
Мысль конечно интересная, но может не хватить например памяти.
Работа с архивами - тяжелая операция.
Некоторые архиваторы могут использовать несколько CPU при работе.

Прежде чем что-либо делать параллельно сделай сначала самый простой вариант с одним процессом. Потому что параллельное программирование - это вообще отдельная большая тема.

И скажи какая задача в целом ? В чем собственно состоит "обработка" файлов в архиве ?
0
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
09.09.2009, 15:11  [ТС]
Задача предельно простая. Есть распределенная 1С 7.7 необходимо модернизировать компоненту УРБД чтобы в периферийные базы выгружались только те данные которые предназначены непосредственно только этой базе. Так как залезть в компоненту УРБД и поправить ее dll у меня знаний просто не хватает (свою первую книжку по С++ взял в руки только в июле) решил мучить архив. На данный момент необходимый файл в один поток благополучно обрабатывается, проблемными остались некоторые моменты.

1) Данные из файла грузятся в список значений, обрабатываются и выгружаются, но я уже третий день бьюсь над высвобождением памяти, съедает память, а корректно настроить деструктор никак не получается, бросает большую часть данных, но это дело логики программы с этим я сам справлюсь.
2) У меня есть стойкое желание не работать с архивом используя внешние архиваторы запуская их с консоли, как внедрить какой нибудь модуль архивирования в свою прогу пака не знаю, но очень хочу.
3) Сервер на котором будет крутиться эта прога 8-и ядерный, я думаю ничего ему не будет если я запущу 2-6 потоков одновременно, тем более что я хочу управлять количеством потоков для нахождения оптимального количества под этот сервер. Большая часть ресурсов уходит на обработку файла.
4) Хочу прикрутить логирование всего что прога сделала, включая время выполнения и объем обработанных данных. Это мне нужно во первых для красоты а во вторых понять уязвимые места программы, и дает ли она сбои во время тестового прогона на реальных данных.

Вот в принципе и все задачи которые у меня остались.

P.S. К сожалению с английским у меня очень туговато, просьба ссылки давать на русскоязычные источники, если они вообще существуют.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
09.09.2009, 15:29
У меня есть стойкое желание не работать с архивом используя внешние архиваторы запуская их с консоли, как внедрить какой нибудь модуль архивирования в свою прогу пака не знаю, но очень хочу.
А зачем ?
Не проще ли распаковать, потом обработать, потом запаковать ?
Сервер на котором будет крутиться эта прога 8-и ядерный
Вроде как 8-ядерных массово не делают ?
Или ты Intel Core i7 обозвал 8-ядерным ?
Так он 4-ех ядерный
0
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
09.09.2009, 15:42  [ТС]
А зачем ?
Не проще ли распаковать, потом обработать, потом запаковать ?
Проще, но в данный момент PKUNZIP.EXE жудко пикает через встроенную пищалку сервера, и постоянно материться. В принципе это можно побороть, или взять другой архиватор, но хочется разобраться с принципами использования сторонних библиотек, самое тяжелое для меня сейчас это как в VC++ я могу подключит библиотеку и воспользоваться ей.


Вроде как 8-ядерных массово не делают ?
Или ты Intel Core i7 обозвал 8-ядерным ?
Так он 4-ех ядерный
Сервер производства Intel, марку сейчас не скажу, не я ведаю железками, а топать в серверную лень. Знаю только то что стоят 2 4-х ядерных Xeon-а, и 4 гига оперативки. Так что получаем 8 независимых ядер в 2-х физических процах.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
09.09.2009, 17:48
хочется разобраться с принципами использования сторонних библиотек
Принцип использования для каждой библиотеки разный.
Так что ничем не лучше.
Вместо PKUNZIP можно взять infozip-овский unzip.
Или вообще взять 7zip.
Знаю только то что стоят 2 4-х ядерных Xeon-а, и 4 гига оперативки.
Вот это понятнее.
Только памяти маловато
0
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
10.09.2009, 09:38  [ТС]
Принцип использования для каждой библиотеки разный.
Надеюсь, принцип подключения сторонних разработок в VC++ 2008 един для всех подобных библиотек. Форматы переменных, команды, типы данных могут быть разными, но должно же их что то объединять?
Вот я скачал архив, разархивировал его, а там куча файлов. И сразу встает куча вопросов. Что с ними делать? Куда их запихнуть? Где что прописать, что бы можно было заголовочный файлы использовать в своей разработке? Я понимаю, что эти вопросы возникают из-за банального незнания Microsoft Visual Studio 2008, но может быть кто то наталкивался на какое нибудь подобие мануала как это настраивается.

Вот это понятнее.
Только памяти маловато
Памяти самый аккурат, на 10 пользователей которые не постоянно сидят в терминале, остается еще тьма памяти не занятой. Сервер брался с перспективой на будущее.

P.S. Пока что весь наш диалог напоминает мне лирическое отступление от темы. А по существу вопроса что нибудь есть? Или как всегда придется придерживаться поговорки "Если хочешь что то сделать хорошо, сделай это сам."

Добавлено через 8 минут
И еще попутный вопросик.

У меня двусвязный список в котором хранятся ссылки на переменные, при удалении этого списка я полностью теряю связь со всеми этими ссылками, но программа по прежнему занимает много места. Вся сложность заключается в том что список не линеен. По началу я решил продублировать все ссылки в линейный список, и проверить что не удаляется. Но и тут не обошлось без подводных камней. В режиме отладки я вижу какая переменная была удалена, а какая нет, но вот программно я не могу перебрать и выделить не удаленные переменные и отсортировать из по определенному критерию. Вся проблема заключается в том чтобы определить что храниться по ссылке, реальная переменная или мусор оставшийся после удаления переменной. Если какие нибудь методы, не приводящие к краху программы, с помощь которых можно проверить действительна ли еще ссылка, или она ссылается в "никуда".
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
10.09.2009, 10:40
Цитата Сообщение от Yukimir Посмотреть сообщение
Если какие нибудь методы, не приводящие к краху программы, с помощь которых можно проверить действительна ли еще ссылка, или она ссылается в "никуда".
C
1
2
3
some_type *some_type_pointer;
...
if ( some_type_pointer != NULL ) /* на что-то указывает */
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
10.09.2009, 10:57
Вот я скачал архив, разархивировал его, а там куча файлов.
Прочитать readme, прочитать документацию.
Прочитать примеры использования - в таких библиотеках этого всего полно.
Если нет в исходниках, то нетрудно найти в Internet.
Что с ними делать? Куда их запихнуть? Где что прописать, что бы можно было заголовочный файлы использовать в своей разработке?
Самое простое - положить нужные *.c и *.h файлы в каталог к своей программе.
Потом добавить в проект файлы *.c - чтобы компилировались.
Файлы *.h добавить с помощью #include "file.h" в свою программу.

Добавлено через 4 минуты
Если хочешь что то сделать хорошо, сделай это сам.
Ты хочешь чтобы кто-то другой за тебя подключил эту библиотеку ?
Я у себя и так ее использовал, но тебе-то это не поможет
Если ты хочешь научиться подключать ЛЮБЫЕ библиотеки, то должен сам разобраться в ЭТОЙ библиотеке.
Дальше будет легче
А вопросы задавать более конкретные и осмысленные.
Для начала прочитай документацию что идет в библиотеке.

Добавлено через 2 минуты
Если какие нибудь методы, не приводящие к краху программы, с помощь которых можно проверить действительна ли еще ссылка, или она ссылается в "никуда".
Просто поддерживай целостность. Если ты удалил данные c помощью free(), то указатель который на них ссылается сам установи в NULL.
Тогда у тебя все что != NULL точно будет указывать на данные, а все что == NULL не будет никуда указывать

Добавлено через 55 секунд
Или другой способ - завели флажок, который говорит содержит ли указатель полезные данные или не содержит.
Можно применять оба способа одновременно.
0
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
11.09.2009, 15:57  [ТС]
При оптимизации программы возникла потребность прочитать последнюю строку в записанном файле. Сейчас это выглядит примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
   fstream f;
   f.open(file_name.c_str());
 
   do
   {
      if<<sp->data<<endl;
         f(sp->nested != 0)
            vigryz_file(f, sp->nested);
   }while(sp->SetNext())
...
 
void vigryz_file(fstream &f, Spisok *sp)
{
   do
   {
      if<<sp->data<<endl;
         f(sp->nested != 0)
            vigryz_file(f, sp);
   }while(sp->SetNext())
}
Кусок кода в очень упрощенном виде, но вполне рабочий. Мне нужно после выхода из функции vigryz_file в файле в последней строке поменять "}}" на "},". Могу ли я каким то образом это сделать?

sp->data типа string, а файл обыкновенный текстовый.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
11.09.2009, 19:27
Цитата Сообщение от Yukimir Посмотреть сообщение
if<<sp->data<<endl;
может
C++
1
f<<sp->data<<endl;
?
В двух местах, кстати...

Добавлено через 4 минуты
Цитата Сообщение от Yukimir Посмотреть сообщение
f(sp->nested != 0)
А вот тут, похоже
C++
1
if(sp->nested != 0)
0
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
14.09.2009, 09:48  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
может
C++
1
f<<sp->data<<endl;
?
В двух местах, кстати...

Добавлено через 4 минуты

А вот тут, похоже
C++
1
if(sp->nested != 0)
Как я сразу не заметил такую ошибку. Конечно ты прав f и if наоборот, примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
   fstream f;
   f.open(file_name.c_str());
 
   do
   {
      f<<sp->data<<endl;
         if(sp->nested != 0)
            vigryz_file(f, sp->nested);
   }while(sp->SetNext())
...
 
void vigryz_file(fstream &f, Spisok *sp)
{
   do
   {
      f<<sp->data<<endl;
         if(sp->nested != 0)
            vigryz_file(f, sp);
   }while(sp->SetNext())
}
Сейчас у меня пишется не напрямую в файл, у меня используется пока временная переменная, но при большом количестве данных это сильно тормозит систему. Я бы хотел избавиться от этой переменной и писать сразу в файл. Последовательно читать или писать я в него могу, а вот читать 2 последних символа, во время записи я пока не научился, подскажите как это возможно.
0
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
15.09.2009, 09:36  [ТС]
Если кто столкнется с проблемой одновременного чтения записи в файл вот вам кусочек кода который у меня заработал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main()
{
std::fstream savedData("file.txt",std::ios::in | std::ios::out | std::ios::trunc);//открыть файл на чтение/запись, с удалением всего что там было
savedData << "abcdef";
char text[3];
//end[2] = '\0';
savedData.seekg(-2, std::fstream::end);
savedData.read(text, sizeof(text)-1);
text[2] = 0;
if ( !strcmp(text, "ef") )
   savedData.seekp(-2, std::fstream::end);
savedData << "yo"; // перезаписать "ef" на "yo"
system("pause"); 
}
Может кому и пригодится. Будут вопросы пишите.

P.S. Вопрос о работе с архивами остался открытым. Через system() давно уже разобрался, но мне хочется механизм интегрировать в свою программу. И еще маленькая просьба: ссылки на англоязычные источники не предлагать так как точно не помогут.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
15.09.2009, 16:01
Вопрос о работе с архивами остался открытым.
Так ты zziplib смотрел или нет ?
ссылки на англоязычные источники не предлагать так как точно не помогут.
Тогда тебе ничего не поможет - 99.9% библиотек имеют документацию, примеры и комментарии на английском.
0
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
15.09.2009, 16:25  [ТС]
Цитата Сообщение от odip Посмотреть сообщение
Так ты zziplib смотрел или нет ?

Тогда тебе ничего не поможет - 99.9% библиотек имеют документацию, примеры и комментарии на английском.
zziplib посмотрел, пока ничего не понял, все из-за отсутствия знаний английского.

Порой 0,1% достаточно чтобы начать самому разбираться. Сегодня с утра мне дали совет как можно работать с файлом, к обеду я не только разобрался что к чему, но и переделал свою программу, теперь один из вопросов снят с повестки дня. По zlib и zziplib пока ничего не получается. Уже перепробовал больше дюжины тестовых примеров которые нашел, но ни один из них у меня так и не скомпилировался, большая часть проблем из-за того что почти все примеры уже давно как обросли бородой. С zlib я застрял на том что я немогу получить библиотеку zlib.lib. Мне удалось заставить VC++ скомпилировать библиотеку, но на выходе я получил zlib1d.lib которая наотрез отказалась работать с моей тестовой программой. Описание команд zlib я нашел, в принципе немного поломать голову и можно будет сделать свой архиватор, это не большая проблема. Для меня проблема это достать не исходники, а готовую библиотеку которую я смогу использовать в своем проекте.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
15.09.2009, 16:53
Мне удалось заставить VC++ скомпилировать библиотеку, но на выходе я получил zlib1d.lib которая наотрез отказалась работать с моей тестовой программой.
Вроде я тебе это уже говорил.
Не собирай библиотеку вообще !
Включи нужные исходники в свою программу.
И исходники zlib & zziplib.
Для простоты - положи все нужные файле прямо к себе в каталог со своей программой.
Хотя разложить все правильно не составляет большого труда.
zip1d.lib - это наверное отладочная версия.

Добавлено через 1 минуту
Там вроде для Visual Studio отдельно написаны инструкции для сборки (я имею zlib & zziplib).
Просто я когда-то собирал эти две библиотеки для одного товарища.
Сам-то я их не использовал - точнее только проверил что примеры работают.
0
evlan
18.09.2009, 15:03
Цитата Сообщение от Yukimir Посмотреть сообщение
...
И еще попутный вопросик.

У меня двусвязный список в котором хранятся ссылки на переменные, при удалении этого списка я полностью теряю связь со всеми этими ссылками, но программа по прежнему занимает много места. Вся сложность заключается в том что список не линеен. По началу я решил продублировать все ссылки в линейный список, и проверить что не удаляется. Но и тут не обошлось без подводных камней. В режиме отладки я вижу какая переменная была удалена, а какая нет, но вот программно я не могу перебрать и выделить не удаленные переменные и отсортировать из по определенному критерию. Вся проблема заключается в том чтобы определить что храниться по ссылке, реальная переменная или мусор оставшийся после удаления переменной. Если какие нибудь методы, не приводящие к краху программы, с помощь которых можно проверить действительна ли еще ссылка, или она ссылается в "никуда".
В данном случае, проще всего использовать boost::shared_ptr или boost::scoped_ptr (см. boost.org
), смотря что надо. Определения этих клссов находятся в заголовочных файлах ибо они шаблонные, а занчит компилировать библиотеку и линковать её при сборке проекта, не надо.
Или, как вариант, можно написать свой упрощённый вариант умного указателя, который сам будет заботиться об очищении памяти (в деструкторе, т.е. память особождается когда разрушается объект хранящий ссылку). Тогда утечек не будет, и при работе с памятью будешь пользоваться только new/malloc.


Я на эту темку (да и форум ) случайно наткнулся, гугля по zip либам, но у меня всё гораздо хуже. Я не могу доставлять библиотеки в систему (работаю через Citrix, сама рабочая машина в Швеции, вроде). Пока нарыл у себя только zlib, но он мне не подходит. Так что пользую workaround в виде FILE* f = popen("unzip -l test.zip", "r"); что бы получить список файлов в архиве, например.
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
18.09.2009, 17:06
Пока нарыл у себя только zlib, но он мне не подходит
Не подходит для чего ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2009, 17:06
Помогаю со студенческими работами здесь

Работа с zip архивами (нужный порядок файлов)
Всем доброго времени суток! Хочу сделать мини-программу для смены атрибутов эл. книг формата epub - автора, название etc. epub это...

Посоветуйте хорошую библиотеку для работы с zip-архивами
Здравствуйте. Быть может кто-то посоветует что-то хорошее? В гугл не посылать, пол интернета перелопатил, попадается только либы каменного...

If else помогите разобраться
Доброго времени суток всем. Не так давно начали программировать в C++ MS Visual Studio 2010? и возникло у меня затруднение в работе с if ...

Помогите разобраться
У меня есть координаты North,West,East,South. Мне нужно отобразить их на осях ОХ и ОУ. Допустим я ввожу North 5 East 3 South 1 ...

Помогите разобраться со структурами
Приветствую всех! :) Мне дали очередное задание с которым, конешноже я не могу самостоятельно справиться и именно поэтому вновь прошу вашей...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
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