Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Yukimir
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
09.09.2009, 09:36     Помогите разобраться с zip архивами. #1
Есть zip-архив, из него надо вытащить определенный файл, обработать его и запихнуть обратно, сохранив все остальные файлы. Если кому не трудно подскажите, как проще работать с архивами.

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

Еще попутно пару вопросиков.
Программка, которую я пишу будет обрабатывать несколько архивов подряд, все действия однотипные и я решил их распараллелить, вопрос такой можно ли как-нибудь управлять количеством инициированных процессов. Я хочу при запуске программы передавать ей параметр, в котором будет указанно максимальное количество процессов, это что бы процессов не было больше чем процов на сервере и чтобы еще пользователям что то оставалось.
Еще вопрос который меня заинтересовал, но пока еще не начал изучать, если разные архивы будут обрабатываться параллельно в разных процессах можно ли будет писать логи в один файл, и как это лучше делать? Присвоить глобальной переменной файл логов и все процессы туда будут писать, или лучше организовать какой-нибудь вектор и туда добавлять данные логов, а по завершению всех обработок скинуть в файл. Не знаю какой из них возможен и проще осуществить.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
09.09.2009, 14:18     Помогите разобраться с zip архивами. #2
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 при работе.

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

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

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

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

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


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

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

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

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

У меня двусвязный список в котором хранятся ссылки на переменные, при удалении этого списка я полностью теряю связь со всеми этими ссылками, но программа по прежнему занимает много места. Вся сложность заключается в том что список не линеен. По началу я решил продублировать все ссылки в линейный список, и проверить что не удаляется. Но и тут не обошлось без подводных камней. В режиме отладки я вижу какая переменная была удалена, а какая нет, но вот программно я не могу перебрать и выделить не удаленные переменные и отсортировать из по определенному критерию. Вся проблема заключается в том чтобы определить что храниться по ссылке, реальная переменная или мусор оставшийся после удаления переменной. Если какие нибудь методы, не приводящие к краху программы, с помощь которых можно проверить действительна ли еще ссылка, или она ссылается в "никуда".
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
10.09.2009, 10:40     Помогите разобраться с zip архивами. #8
Цитата Сообщение от Yukimir Посмотреть сообщение
Если какие нибудь методы, не приводящие к краху программы, с помощь которых можно проверить действительна ли еще ссылка, или она ссылается в "никуда".
C
1
2
3
some_type *some_type_pointer;
...
if ( some_type_pointer != NULL ) /* на что-то указывает */
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
10.09.2009, 10:57     Помогите разобраться с zip архивами. #9
Вот я скачал архив, разархивировал его, а там куча файлов.
Прочитать readme, прочитать документацию.
Прочитать примеры использования - в таких библиотеках этого всего полно.
Если нет в исходниках, то нетрудно найти в Internet.
Что с ними делать? Куда их запихнуть? Где что прописать, что бы можно было заголовочный файлы использовать в своей разработке?
Самое простое - положить нужные *.c и *.h файлы в каталог к своей программе.
Потом добавить в проект файлы *.c - чтобы компилировались.
Файлы *.h добавить с помощью #include "file.h" в свою программу.

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

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

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

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, а файл обыкновенный текстовый.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
11.09.2009, 19:27     Помогите разобраться с zip архивами. #11
Цитата Сообщение от Yukimir Посмотреть сообщение
if<<sp->data<<endl;
может
C++
1
f<<sp->data<<endl;
?
В двух местах, кстати...

Добавлено через 4 минуты
Цитата Сообщение от Yukimir Посмотреть сообщение
f(sp->nested != 0)
А вот тут, похоже
C++
1
if(sp->nested != 0)
Yukimir
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
14.09.2009, 09:48  [ТС]     Помогите разобраться с zip архивами. #12
Цитата Сообщение от 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 последних символа, во время записи я пока не научился, подскажите как это возможно.
Yukimir
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
15.09.2009, 09:36  [ТС]     Помогите разобраться с zip архивами. #13
Если кто столкнется с проблемой одновременного чтения записи в файл вот вам кусочек кода который у меня заработал:

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() давно уже разобрался, но мне хочется механизм интегрировать в свою программу. И еще маленькая просьба: ссылки на англоязычные источники не предлагать так как точно не помогут.
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
15.09.2009, 16:01     Помогите разобраться с zip архивами. #14
Вопрос о работе с архивами остался открытым.
Так ты zziplib смотрел или нет ?
ссылки на англоязычные источники не предлагать так как точно не помогут.
Тогда тебе ничего не поможет - 99.9% библиотек имеют документацию, примеры и комментарии на английском.
Yukimir
0 / 0 / 0
Регистрация: 26.08.2009
Сообщений: 11
15.09.2009, 16:25  [ТС]     Помогите разобраться с zip архивами. #15
Цитата Сообщение от odip Посмотреть сообщение
Так ты zziplib смотрел или нет ?

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

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

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

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


Я на эту темку (да и форум ) случайно наткнулся, гугля по zip либам, но у меня всё гораздо хуже. Я не могу доставлять библиотеки в систему (работаю через Citrix, сама рабочая машина в Швеции, вроде). Пока нарыл у себя только zlib, но он мне не подходит. Так что пользую workaround в виде FILE* f = popen("unzip -l test.zip", "r"); что бы получить список файлов в архиве, например.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2009, 17:06     Помогите разобраться с zip архивами.
Еще ссылки по теме:

C++ Работа с zip архивами (нужный порядок файлов)
C++ Работа с zip архивами
ПОМОГИТЕ РАЗОБРАТЬСЯ В КОДЕ C++
Посоветуйте хорошую библиотеку для работы с zip-архивами C++
Помогите разобраться в коде C++

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
18.09.2009, 17:06     Помогите разобраться с zip архивами. #18
Пока нарыл у себя только zlib, но он мне не подходит
Не подходит для чего ?
Yandex
Объявления
18.09.2009, 17:06     Помогите разобраться с zip архивами.
Ответ Создать тему
Опции темы

Текущее время: 05:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru