![]() |
|
Модераторы: ginnie, korob2001 |
![]()
|
|
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Привет!
Вобщем проблема такая: Есть каталог, в котором примерно 4000 ZIP архивов. Необходимо открыть этот каталог и пройти по каждому архиву, с этим проблем нет. На каждой итерации цикла, открывать текущий архив и разархивировать его в другой каталог. При этом, файл который содержится в zip'e, должен сохранить своё имя. В каждом архиве, по одному файлу. Вобщем нужно что бы во втором каталоге получилось около 4000 файлов из zip архивов. Пробовал читать доки по модулю Archive::Zip, но ничего не понял, правда понял как запихнуть файл в .zip, а вот с обратным процессом проблема. Может кто сталкивался с такой траблой? Заранее спасибо. Денис -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 3 Всего: 44 |
самый простой способ
|
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: нет Всего: 83 |
кстати, можно ещё выполнить вот такой вызов:
где вот это: -C /path/to/unzipped/files указывается для того, чтобы раскрыть аржив в директорию, отличную от той, где он лежит... |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Спасибо. Но как я понял всё это работает под ...nix'ами, а я под виндой. ;)
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Всем спасибо за желание помочь.
Уже разобрался в доках к модулю Archive::Zip. Вобщем, всё великое в простом. Вот рабочий пример разорхивации ZIP архива:
Во как ;). Может кому пригодится. Вот написал такой код:
Для тех кто не понял, поясню: Допустим у вас в каком-либо каталоге валяется большое кол-во архивов ZIP ( у меня их оказалось около 4000 ) и вам понадобилось, распаковать их все ( делать это вручную, занятие утомительное ;] ). Сохраняем в каталог с ZIP архивами этот код в файл unzip.pl и просто запускаем его на выполнение ( perl unzip.pl ). После чего будет создан каталог в который будут переноситься все, уже разархивированные ZIP архивы, а в текущем каталоге останутся только извлечённые файлы. Если возникнут вопросы по коду, пишите здесь. Удачи. ;) Это сообщение отредактировал(а) korob2001 - 7.11.2004, 01:08 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: 1 Всего: 9 |
если у вас в архиве есть директории
и вам захочется разархивировать их в другую директорию не в текущую ? ;) -------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Думаю с помощью Archive::Zip это реально. Просто нужно с документауией разобраться до конца, а у меня с лэнгвичем не очень, да и инет отсутствует
Так сложилось, что мне пришлось учить Нидерладский язык, да и то не могу им похвастаться Английский, знаю только школьную пограмму. Вот так и живу. Вобщем, я хочу полностью изучить этот модуль, как дойду до этой темы, дам знать. Но можно ведь воспользоваться возможностями самого Perl, правда прийдётся пожертвовать производительностью. Вот что я имею ввиду: 1. Вырезаем имя самого ZIP архива, без расширения, и сохраняем его в переменную. 2. В каталоге в который будем разархивировать архив, создаём каталог с именем ZIP архива, которое сохранили в переменную в первом пункте. 3. Копируем текущий архив, в только что созданный каталог. 4. Переходим в него и там его разархивируем. 5. Удаляем ZIP архив из новой директории. В конечном итоге получаем каталог, с вложенными каталогами, которые имеют аналогичные имена как и ZIP архивы. В каждом, этом каталоге будут размещены, все файлы и каталоги которые были в ZIP архиве. Но, так как это нужно делать на каждой итерации, производительность понизится. Electrical Storm - думаю у тебя не возникнет проблем с этой задачей ( потому код писать не стал ). Если знаешь сам, как это сделать с помощью модуля Archive::Zip или более производительней, напиши, буду очень признателен. Хотя в моём случае в архиве всего 1 файл, но вопрос действительно интересный, на будущее. Такая утилтка, под рукой, никогда не помешает. ;) Сейчас скачаю себе этот модуль и дома пострадаю, может чего и выстадаю. ;) Удачи. Это сообщение отредактировал(а) korob2001 - 9.11.2004, 23:29 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| ElectricalStorm |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: 1 Всего: 9 |
Конечно знаю поэтому и спросил ;) вдруг пригодиться .... я не просто так спросил у этого модуля есть один не понятный момент ... он поразному рабоатет на FreeBSD и WinXP вот его я и имел ввиду... когдато давно я просто столкнулся с этой проблемой ....
-------------------- Нужно знать инструмент, которым пользуешься |
||||
|
|||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Я вот вчера тоже пострадал, немного. ;) Тоже нашёл это дело, но оно почемуто не работает. Правда там, в первом параметре пердаётся имя файла из ZIP архива. Один раз вроде сработало, а попробовал пройти по всему дереву с помощью while. Вот туто я и обламался.
Выдаёт ошибку ввода/вывода. Указывает на каталог и пишет Access diened. Права на каталог установлены "Только чтение" и что самое главное я не могу их изменить даже в самой системе. У винды бывают такие глюки. :[ Вот такие пироги. Ладно, повожусь еще ночьку. Завтра дам знать, что получилось. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Извините, я новичек, но почему нельзя было и имена файлов найти и сохранить в массив через
|
|||
|
||||
| Bolt |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 21.2.2005 Репутация: нет Всего: нет |
use File::Spec; «и будет вам счастье»
вероятно потому, что
|
||||||
|
|||||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Абсолютно верно, просто glob не вернёт имена всех файлов текущего каталога, если файлов много. Можно было конечно же заюзать системную коммаду, но в таком случае мы привязываем сами сабя к определённой оболочке. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Bolt |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 21.2.2005 Репутация: нет Всего: нет |
если речь идет о
то это работает везде т.к. grep - встроенная функция. а вот про glob - спорно. при вызове glob автоматоически подгружается модуль File::Glob... Начиная с версии Perl 5.6, до этой версии использовался внешний процесс (csh). т.о. use File::Glob ':glob'; #используем glob из POSIX, а не csh... А я имел ввиду, цитируя, лишь количество файлов: массив получается довольно ёмкий, как ни крути, и держать его в памяти ни есть хорошим стилем программирования. Кстати, относительно отличий исполнения под win* и *nix: одно из них заключено в том, что под win* стоило бы присваивать значения undef объёмным массивам и хэшам в конце программы, дабы явно освободить память. imho. |
||||
|
|||||
| korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Ты считаешь, что под виндой память не освобождается после того, как программа завершает свою работу????
Насколько я знаю, то undef( @arr ), применяется в том случае, если программа продолжает работу, а массив @arr больше не нужен и нужно вернуть в текущий момет всю занимаемую им память в пул пямяти процесса, но далеко не все системы поддерживают это.
Нет, речь идёт о таком способе:
или
Но и с grep мы грузим память, потому как grep вернёт список файлов. Это сообщение отредактировал(а) korob2001 - 10.3.2005, 19:50 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
| Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: нет Всего: 5 |
Пародон за оффтоп: в винде, если есть WinRAR, выделяются все архивы, потом правый клик, пункт: распаковать ВСЕ аривы в ... =)
|
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Эх Ramirez
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Guest123 |
|
|||
|
Unregistered |
А может Вы подскажете как вывести имена файлов (и их размер) ZIP архива не ражимая его? т.е. на лету прочесть??
perldoc Archive::ZIP читал - так ничего и не получилось внятного можь подскажите че?? |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Не катит. Т.е. вообще такого нет в мануале к zip! Разархивирю так: $zip=Archive::Zip->new("file.zip"); $zip->extractMember("unzip.dat","unzip_new.dat"); |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Guest - Как так нет? Вот тебе часть документации, где описывается метод extractTree().
perldoc Archive::Zip
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
![]()
|
| Правила форума "Perl: Системное программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |