Русское сообщество AutoIt

  • Май 20, 2012, 13:26:43 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:

Вы новичок? Хотите начать изучение AutoIt и не знаете с чего начать?

Для начала ознакомьтесь с темой Быстрый старт для работы с AutoIt.
Затем осмотрите раздел Инструменты и помощь по AutoIt.

Реклама

Автор Тема: Удаление файлов из архива *.zip  (Прочитано 1736 раз)

0 Пользователей и 1 Гость смотрят эту тему.

RUVATA [?]

  • Осваивающий
  • **
  • Репутация: 30
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 125
  • Версия AutoIt: v 3.3.6.1
  • лучше один раз увидеть, чем десять раз услышать...
    • Награды
Всем доброго времени суток...
Стоит задача:
разобраться и по возможности оптимизировать довольно большое количество архивов в формате zip... (Архиватор 7-zip)

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

Все это исполнено на AutoIt...
И так хочется, решить еще одну задачку не прибегая к использованию других ЯП и технологий, а именно:
В большом количестве архивов, часть файлов является ненужными или повторяющимися от архива к архиву без изменений. Мои предшественники по этому поводу не заморачивались, т.к. файлы эти в упакованном состоянии - довольно "легкие", по 1,5 - 2 Мб
Автоматизировать процесс им видимо не хватало мозгов, а выполнять вручную непозволяла вселенская лень.
В масштабе одного архива это конечно было незаметно... Да и изначально их задумывалось делать 2-3 раза в месяц...
но ситуация изменилась и потом их стали лепить ежедневно, а потом и по 2-3 раза в день. Итого у меня сейчас ~4500 шт. архивов в каждом из которых 1,5 - 2 Мб мусора, что есть ~ 8 Гб.
Обидно и непрофессионально, - хочу исправить...

Я уже имел дело с фреймворками для .NET которые позволяют работать с zip как есть без перепаковки.
Т.е. я как бы могу сейчас вооружиться Visual Studio и на C# накидать что-то подходящее...
НО Я ХОЧУ НА AutoIt !!! (катаясь по полу, стуча кулаками)
 
Вручную при помощи архиватора 7-zip (обожая уважаю  8) ) так-же можно редактировать содержание архива... но среди функционала консольной версии 7za я пока такого трюка не нашел (хотя поиски продолжаются)

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









  Записан
Полезный совет? - жми "Полезное сообщение" :) не стесняйся...
И автору приятно, и для соискателей толк.

ynbIpb [?]

  • Продвинутый
  • ***
  • Репутация: 84
  • Online Online
  • Пол: Мужской
  • Сообщений: 339
  • Версия AutoIt: 3.3.8.1
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #1, Отправлен: Май 10, 2011, 14:17:16 »
пример содержимого архива и какие файлы надо удалять в студию!
удалять рекурсивно? тоесть перебирать все каталоги и подкаталоги? Имена файлов одинаковые или разные?

з.ы.
топик больше для раздела Стол заказов
« Последнее редактирование: Май 10, 2011, 14:23:31 от ynbIpb »



  Записан

RUVATA [?]

  • Осваивающий
  • **

  • Автор темы
  • Репутация: 30
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 125
  • Версия AutoIt: v 3.3.6.1
  • лучше один раз увидеть, чем десять раз услышать...
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #2, Отправлен: Май 10, 2011, 14:56:56 »
ynbIpb  [?]
Цитата
топик больше для раздела Стол заказов
Дык я как бы для развития функционала своего приложения, мне готовенького "нэ требо", мне сопособ понять.

Рекусивно.
Например в архиве полезные файлы имеют расширение *.CD чаще всего такой файл один, но не всегда. Все остальное - можно kill (В отдаленном принципе :) пусть в процессе вкуривания пока будет так)

Мне бы глазком поглядеть как это делается...

PS: Уже накопал Zip_UDF, но пока еще не углублялся...
пока курю 7za, все прелестно за исключением одного - содержимое архива кажет таблицей в MS-DOS(cp866)... Распарсить с ходу не получается...
вобщем вот так (см.вложение)
далее все тот-же 7za позволяет delete по полному путь+имя (относительно корня архива)


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться




  Записан

Garrett [?]

  • Локальный модератор
  • *
  • *****
  • Репутация: 548
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 2056
  • Версия AutoIt: 3.3.6.1
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #3, Отправлен: Май 10, 2011, 15:24:30 »
RUVATA  [?]
Цитата
содержимое архива кажет таблицей в MS-DOS(cp866)... Распарсить с ходу не получается...
Код: AutoIt [Выделить]
#include <Encoding.au3>
_Encoding_866To1251($sData)


Добавлено: Май 10, 2011, 15:26:22
Listing archive: Doc.zip

--
Path = Doc.zip
Type = zip
Physical Size = 133

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2011-05-10 14:29:32 ....A           11           11  Doc_Тест.txt
------------------- ----- ------------ ------------  ------------------------
                                    11           11  1 files, 0 folders




  Записан

--------------------------------------------------------------------------------------------------
Все стандарты Document Object Model HTML
--------------------------------------------------------------------------------------------------
«Жизнь – цепь, а мелочи в ней – звенья. Нельзя звену не придавать значения!»

ynbIpb [?]

  • Продвинутый
  • ***
  • Репутация: 84
  • Online Online
  • Пол: Мужской
  • Сообщений: 339
  • Версия AutoIt: 3.3.8.1
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #4, Отправлен: Май 10, 2011, 15:37:51 »
Если нужны только *.CD файлы (я их не заметил в списке, может *.1CD), то проще создавать новые архивы чем ковыряться в старых.
Распаковываешь в темп, все файлы с этим расширением, создаёшь архив с именем старого и заменяешь.
Писал я нечто похожее на заказ, использовал консольный 7z.exe (он ссобой Длл'ку таскает)
Информация из справки 7зипа:
Цитата
7z e archive.zip -oc:\soft *.1cd -r
extracts all *.1cd files from archive archive.zip to c:\soft folder.
и нечего заморачиваться с кодировками
Собирай все имена архивов в массив _FileListToArray и потом в цикле For Next перебирай.
Код: AutoIt [Выделить]
#Include <File.au3>
#Include <Array.au3>
$s7z_exe = @ScriptDir & "\data\7z.exe" ; путь к консольной версии архиватора 7zip
$s7z_dll = @ScriptDir & "\data\7z.dll" ; путь к библиотеке, которую использует 7zip

_unpack ("D:\архивы\111111.zip")

Func _unpack ($sArch)
    $sTempDir = @TempDir & "\Arch_unpacker" ; временная папка, куда будут извлекаться файлы
    If FileExists ($sArch) = 0 Then Return "" ; если архива нет, то возвращаемся из функции
    RunWait ( $s7z_exe & ' e ' & '"' & $sArch & '" -o"'& $sTempDir &'" *.1CD -r -aoa', @ScriptDir & '\data', @SW_HIDE); запускаем архиватор и приостанавливаем скрипт
    $aTempFiles = _FileListToArray($sTempDir, "*.*", 1) ; собираем имена всех файлов в этом  временном каталоге
    _ArrayDisplay($aTempFiles) ; отладка
    DirRemove ($sTempDir, 1) ; после обработки удаляем все временные файлы вместе с папкой.
EndFunc
« Последнее редактирование: Май 10, 2011, 15:58:43 от ynbIpb »



  Записан

RUVATA [?]

  • Осваивающий
  • **

  • Автор темы
  • Репутация: 30
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 125
  • Версия AutoIt: v 3.3.6.1
  • лучше один раз увидеть, чем десять раз услышать...
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #5, Отправлен: Май 10, 2011, 16:18:18 »
ynbIpb  [?]
Цитата
я их не заметил в списке, может *.1CD
верно, верно - опечаточка... *.1CD (это файлы БД 1С 8.х)

Цитата
Распаковываешь в темп, все файлы с этим расширением, создаёшь архив с именем старого и заменяешь.
очень ресурсоемко... учитывая, что ненужные файлы имеют 2-6 % от общего объема
берем один из моих архивов весом в 650 Мб - вот результаты по скорости:
Если заранее знать что удалять то 7za.exe (облегченная консольная версия 7zip) ей можно указать список в *.txt - удаляет все лишнее за 1,2 мин.
А вот только на распаковку *.1CD из архива необходимо 3,6 мин. + 1,4 Гб темпа... Дальнейшее пересжатие такой-же степени (Ultra) занимает 6,2 мин, потом удаление первоначалного архива (с мусором) еще 40 сек.
итого 10,2 мин.
Я считаю неоправданно, при учете что все таки удастся парсить содержимое архивов налету и подготавливать список для 7za.exe

Garrett, Спасибо... так действительно можно захватив вывод 7za.exe в переменную, парсить ее содержимое налету (не сохраняя в файл)... пригодится...








  Записан

Garrett [?]

  • Локальный модератор
  • *
  • *****
  • Репутация: 548
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 2056
  • Версия AutoIt: 3.3.6.1
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #6, Отправлен: Май 10, 2011, 16:48:26 »
RUVATA
В файле справки 7z обратите внимание на Switches -u мне кажется это то, что вам нужно (правда там есть некоторые ограничения, но всё же).




  Записан

RUVATA [?]

  • Осваивающий
  • **

  • Автор темы
  • Репутация: 30
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 125
  • Версия AutoIt: v 3.3.6.1
  • лучше один раз увидеть, чем десять раз услышать...
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #7, Отправлен: Май 10, 2011, 17:10:09 »
Garrett
более полезен Switches -x

7za.exe d test.zip -r -x!*.1CD при таких параметрах
за молниеносно быстро рекурсивно удаляются все файлы кроме *.1СD... причем -x! можно задавать сколь угодно много...
Завтра опишу на AutoIt и выложу мой нехитрый миханизм:
Разбирает результаты list по архиву... на основании его составляет список, и подает его на завтрак вместе с параметром delete




  Записан

ynbIpb [?]

  • Продвинутый
  • ***
  • Репутация: 84
  • Online Online
  • Пол: Мужской
  • Сообщений: 339
  • Версия AutoIt: 3.3.8.1
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #8, Отправлен: Май 10, 2011, 21:33:54 »
RUVATA  [?]
Цитата
один из моих архивов весом в 650 Мб
:o в таком случае конечно неоправдано. Я то думал там архивчики метра по 2-3




  Записан

RUVATA [?]

  • Осваивающий
  • **

  • Автор темы
  • Репутация: 30
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 125
  • Версия AutoIt: v 3.3.6.1
  • лучше один раз увидеть, чем десять раз услышать...
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #9, Отправлен: Май 13, 2011, 11:04:48 »
Уважаемые посоветуйте...
Задача рекурсивно обойти каталог (вложеность глубиной 5-6)...
каталог забит архивами *.zip, иных файлов в нем нет... Задача все это дело обойти и для каждого архива выполнить нашу "зачистку"...
Вопрос №1 - делать все это одим скриптом циклически или функцией в цикле, или саму процедуру "чистки" реализовать отдельным скриптом (при этом опять-же загружен интерпритатор), а есть еще идея эту вот самую "чистку" скомпилить и а из скрипта вызывать (так помоему максимально эфективно, под каждый будет создаваться свой процесс) но тогда у меня попутный вопрос как к скомпилированным скриптам реализуется передача параметров
Вопрос №2 - Правильнее будет сначала рекурсивно обойти и забить н\п массив - а потом подставляя его значения обрабатывать... или находу т.е. нашел - запустил, следующий...
 




  Записан

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1425
  • Online Online
  • Пол: Мужской
  • Сообщений: 3814
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #10, Отправлен: Май 13, 2011, 11:39:07 »
RUVATA
ИМХО, можно примерно так попробовать:

RUVATA [?]

  • Осваивающий
  • **

  • Автор темы
  • Репутация: 30
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 125
  • Версия AutoIt: v 3.3.6.1
  • лучше один раз увидеть, чем десять раз услышать...
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #11, Отправлен: Май 13, 2011, 14:59:24 »
madmasles
спасибо... пока что раскуриваю функцию _FileSearch ...
... честно думал что для рекурсивного обхода, есть встроенные средства... уложил даже парочку закладок но еще не читал...
Но оч. интересно покопать "внутренности"
пытаюсь понять черную магию вот этого
Код: AutoIt [Выделить]
$h_Dir = Run(@ComSpec & ' /U /C DIR "' & $s_Path_Search & '\' & $a_Masks[$i] & '"' & $s_Subdir & $s_Attrib, @SystemDir, @SW_HIDE, 6)
 




  Записан

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1425
  • Online Online
  • Пол: Мужской
  • Сообщений: 3814
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #12, Отправлен: Май 13, 2011, 15:03:01 »
RUVATA  [?]
Цитата
пытаюсь понять черную магию вот этого
*click*

Последняя "6" это BitOR($STDOUT_CHILD, $STDERR_CHILD) из ...\AutoIt3\Include\Constants.au3.
« Последнее редактирование: Май 13, 2011, 15:10:39 от madmasles »



  Записан

RUVATA [?]

  • Осваивающий
  • **

  • Автор темы
  • Репутация: 30
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 125
  • Версия AutoIt: v 3.3.6.1
  • лучше один раз увидеть, чем десять раз услышать...
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #13, Отправлен: Май 13, 2011, 15:33:49 »
О боги... мне как-то было втяготы понять что мы юзаем CMD ( от которого бежал как от огня в AutoIT :'( )
 :o поплохело вдруг...
Надо поискать другой путь (просто чтобы убедиться что я обречен)  :'(




  Записан

RUVATA [?]

  • Осваивающий
  • **

  • Автор темы
  • Репутация: 30
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 125
  • Версия AutoIt: v 3.3.6.1
  • лучше один раз увидеть, чем десять раз услышать...
    • Награды
Re: Удаление файлов из архива *.zip
« Ответ #14, Отправлен: Май 17, 2011, 14:44:49 »
Вот такие инструменты у меня получились... с их помощью я достиг своей цели... и еще не раз наверное использую эти наработки...
Суть
Далле в коде описаны Две функции:
I. Struct_Reader([$TagertDir],[$OldDir]) -
$TagertDir - путь к целевому каталогу, поумолчанию = @ScriptDir
$OldDir - служебный параметр, если изучите код поймете зачем :)

Эта функция принемает первым параметром адрес изучаемого каталога, и возвращает массив массивов (обзовем его "супермассив"  :IL_AutoIt_1: ) который описывает его структуру ;
Супермассив двухмерный, и все его подмассивы тоже,
в первой размерности имена (файлов/каталогов), а во второй:
1) для каталогов - содержит массив аналогичным образом описывающий его структуру и т.д.
2) для файлов - метка "file" (в идеале я думал о том, чтобы туда писать какую ни будь полезную инфу, но пока так)
PS: За нулевым индексом каждого из массивов закреплена "метаинформация" а именно в первой размерности полный путь к описываемому каталогу, во второй размерности специальные маркеры "no_files" или "no_dirs" или пусто(Nothing) если в каталог есть и те и другие.

II. Struct_Finder($TagertArray, [$TagertDir])
$TagertArray - наш супермассив :) возвращенный функцией Struct_Reader ; обработку подсовывания всякого "Г"  я не делал... так что  :whistle:
$TagertDir - поддиректория содержимое которой необходимо получить, по умолчанию = @ScriptDir

Эта функция возвращает срез массива массивов для указанной поддиректории

PS: Возвращаемый массив - является массивом одного из нижних порядков, но так-же как и родительский  - супермассив, с определенным уровнем вложенности (если не описывает последний уровень вложенности).

Код: AutoIt [Выделить]
#Include <File.au3>
#Include <Array.au3>

;Демонстрация
$Demonstration = Struct_Reader() ; Если исследуемый каталог не каталог скрипта, можно указать путь.
Struct_Finder($Demonstration) ; Вторым параметром этой функции можно задать конкретный подкаталог
;Демонстрация

Func Struct_Reader($TagertDir = @ScriptDir, $OldDir = "")
Dim $Marker
If $TagertDir <> @ScriptDir Then $TagertDir = $OldDir & "\" & $TagertDir
   
$Dirs=_FileListToArray($TagertDir, "*", 2) ; Определяем вложенные каталоги
    If (not IsArray($Dirs)) Then ; Если вложенных каталогов нет, объявляем пустой массив $Dirs
        Dim $Dirs[1]
        $Marker = "D"
    EndIf

$Files=_FileListToArray($TagertDir, "*", 1) ; Определяем вложенные файлы
    If (not IsArray($Files)) Then ; Если вложенных файлов нет, объявляем пустой массив $Files
        Dim $Files[1]
        $Marker = "F"
    EndIf
               
If Ubound($Dirs) + Ubound($Files) > 0 Then ; Подводим итоги предшествующих проверок, - стуктурируем массив
    Dim $Structure[$Dirs[0] + $Files[0] + 1][2]
    $Structure[0][0] = $TagertDir ; Сохраняем путь к опрошенному каталогу.
        If $Marker = "D" Then $Structure[0][1] = "no_dirs"  ; Если в дирректории необнаруженно либо файлов либо каталогов
        If $Marker = "F" Then $Structure[0][1] = "no_files" ; Оставляем "маркер" мне нужно было для отладки, хотя наверное можно найти и практическое прменение :)
           
        If $Marker <> "D" Then ; Если подиректории есть то опишем их, и отметим как "dir" для избиратеольной рекурсии
            For $i = 1 to UBound($Dirs) - 1
                    $Structure[$i][0] = $Dirs[$i]
                    $Structure[$i][1] = "dir"
            Next
        Else
            $i = 1 
        EndIf
       
        If $Marker <> "F" Then ; Если есть вложенные файлы - добавляем их к концу масиива, отмечаем как "File"
                               ; Это мой личный "бзык" так папки будут вверху файлы внизу//
            For $z = $i to $i + $Files[0] - 1
                    $Structure[$z][0] = $Files[$z - $i + 1]
                    $Structure[$z][1] = "file"
            Next   
        Endif
EndIf

For $i = 1 to Ubound($Structure) - 1    ; Собственно рекурсия функции
    If $Structure[$i][1] = "dir" Then
        $Structure[$i][1] = Struct_Reader($Structure[$i][0], $Structure[0][0])
    EndIf
Next

Return $Structure

EndFunc

Func Struct_Finder ($TagertArray, $TagertDir = @ScriptDir)

If StringRight($TagertDir, 1) = "\" Then $TagertDir = StringTrimRight($TagertDir, 1)

If $TagertArray[0][0] <> $TagertDir Then
        For $i = 1 to UBound($TagertArray)-1
        If IsArray($TagertArray[$i][1]) Then Struct_Finder($TagertArray[$i][1], $TagertDir)
        Next
Else
    $Result = $TagertArray
EndIf

_ArrayDisplay($Result, "Result")
EndFunc
 
« Последнее редактирование: Май 17, 2011, 16:11:10 от RUVATA »



  Записан
 


Похожие темы
Тема Автор Ответов Просмотров Последний ответ
[Файловая система] Копирование,переименовывание и удаление файлов
Стол заказов
asperin 2 1311 Последний ответ Апрель 17, 2010, 21:13:18
от asperin
Работа с файлами и удаление их.И склейка 2х файлов.
AutoIt для новичков
Arei 5 962 Последний ответ Октябрь 05, 2010, 16:22:15
от Arei
Удаление файлов не имеющих расширения
AutoIt для новичков
prokazzza 1 763 Последний ответ Февраль 01, 2011, 19:36:12
от CreatoR
Извлечение файлов из архива
AutoIt для новичков
pan1982 2 893 Последний ответ Март 10, 2011, 09:20:23
от pan1982
Поиск и удаление файлов
AutoIt для новичков
prokazzza 9 919 Последний ответ Апрель 07, 2011, 08:22:14
от prokazzza
Поиск файлов на диске и удаление определеного
AutoIt для новичков
ArtDevil 2 625 Последний ответ Апрель 26, 2011, 10:14:02
от madmasles
[Файловая система] Удаление файлов с использованием переменные окружения.
AutoIt для новичков
millifolium 2 393 Последний ответ Декабрь 16, 2011, 12:47:23
от madmasles
[Файловая система] Удаление файлов с usb накопителя.
Стол заказов
Gorenich 5 554 Последний ответ Январь 11, 2012, 12:41:35
от Gorenich
[Элементы GUI] Как на кнопку повесить несколько действий (удаление процесса и удаление файла)
AutoIt для новичков
Matisse 13 305 Последний ответ Март 25, 2012, 20:53:34
от Matisse
Удаление файлов и папок из списка.
Стол заказов
Fergus 2 219 Последний ответ Апрель 08, 2012, 22:34:38
от Fergus


Реклама

* Последние сообщения на форуме
post Re: Проблема с циклами While
[AutoIt для новичков] Andeangl Сегодня в 13:15:19
post Re: Уроки программирования и автоматизации посредством AutoIt для чайников
[Инструменты и помощь по AutoIt] ynbIpb Сегодня в 13:15:02
post Re: [Мышь, клавиатура] Привязка клика по координатам к клавише
[Стол заказов] megatoxx Сегодня в 12:41:37
post Re: Проблема с циклами While
[AutoIt для новичков] Yashied Сегодня в 12:14:25
post Сглаживание рывков при передачи новых координат игрока по TCP/IP
[Общение] Ganibal95 Сегодня в 12:10:37
post Перенесено: Уроки программирования и автоматизации посредством AutoIt для чайников
[AutoIt для новичков] Yashied Сегодня в 12:09:28
post Re: Защита исходного кода программы
[AutoIt для новичков] iamOmg Сегодня в 12:09:05
post Проблема с циклами While
[AutoIt для новичков] Andeangl Сегодня в 11:03:15
post Уроки программирования и автоматизации посредством AutoIt для чайников
[Инструменты и помощь по AutoIt] aak Сегодня в 09:41:45
post Re: Как спарсить ссылку внутри тега "td" определенного класса
[Регулярные выражения и прочее] eropov Сегодня в 05:27:00

* Пользователи онлайн
  • Dot Гостей: 108
  • Dot Скрыт: 2
  • Dot Пользователей: 31
  • Dot Пользователи Online: