Автор Тема: Package UDF - Создание собственных PKR архивов  (Прочитано 13652 раз)

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

Оффлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2949
  • Репутация: 494
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
просмотрел udf. в описании функций упаковки и распаковки есть параметры,позволяющие отображать процесс.можно пример? а то слегка не получается  :-[
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

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

Re: Package UDF - Создание собственных PKR архивов
« Ответ #15 Отправлен: Март 17, 2014, 08:28:08 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
просмотрел udf. в описании функций упаковки и распаковки есть параметры,позволяющие отображать процесс.можно пример? а то слегка не получается  :-[

Пример есть в первом сообщении.


Думай, прежде чем говорить.

Оффлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2949
  • Репутация: 494
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
пример кода
(нажмите для показа/скрытия)

в этом коде я делаю поиск файлов в указанной папке ( есть вложенные папки)
размер общий примерно 700мб
упаковка происходит быстро и без ошибок(ни разу не было ошибки)
распаковку настроил так, что сначала создается структура папок, а потом в них распаковываются файлы. каждый файл в свою папку как было до упаковки. большая часть архива распаковывается быстро. потом несколько раз выпадает ошибка 9 и скрипт зависает на функции распаковки. ни ошибок не выдает и не распаковывает.
при проверке в папках файлы распаковались как положено. то есть структура и расположение файлов и папок получается как до упаковки в исходной папке.
не могу понять в чем ошибка
« Последнее редактирование: Март 18, 2014, 09:28:13 от joiner »

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

Re: Package UDF - Создание собственных PKR архивов
« Ответ #17 Отправлен: Март 18, 2014, 07:10:10 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Скорее всего проблема либо в неправильном пути, либо в его длине. Во-первых, поствьте ConsoleWrite() в код и покажите на каком файле виснит скрипт.

Код: AutoIt [Выделить]
For $x = 1 To UBound($array) - 1
    $n_f = _FO_PathSplit($array[$x])
    $File1 = _PK_GetPacketDescription($hPackage1, -$x)
    ConsoleWrite($path_unpack & '\' & $folder_name[1] & $n_f[0] & $File1 & @CR)
    _PK_ExtractPacketDataToFile($hPackage1, -$x, $path_unpack & '\' & $folder_name[1] & $n_f[0] & $File1)
;   If @error Then ConsoleWrite(@error & @CRLF & $path_unpack & '\' & $folder_name[1] & $n_f[0] & $File1 & @CRLF)
Next


А во-вторых, попробуйте отключить компрессию в функции _PK_AddPacketFromFile().
« Последнее редактирование: Март 18, 2014, 13:53:45 от Yashied »

Оффлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2949
  • Репутация: 494
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
при написании были варианты с ошибочными путями. функция распаковки быстро выкидывала ошибку и не зависала.
отключил компрессию. произошла распаковка более половины архива ( весь архив 700мб - более 4 000 файлов) и скорость распаковки упала раз в десять. процессор был загружен на 50%. я выгрузил скрипт.
ну и компрессия..очень ведь не плохо..не хотел использовать сторонние dll. твоя библиотека прямо то, что нужно
длина пути. ведь распаковка идет. только сильно замедляется и через раз вываливаются ошибки. точнее одна. номер 9. судя по описанию ошибки - это неопознанная ошибка
« Последнее редактирование: Март 18, 2014, 14:35:49 от joiner »

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

Re: Package UDF - Создание собственных PKR архивов
« Ответ #19 Отправлен: Март 18, 2014, 14:19:14 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Проблема в следующем:

Код: AutoIt [Выделить]
For $i = 1 To UBound($f_s) - 1
    ...
   
    $array[$i - 1] = StringRegExpReplace($f_s[$i], '.*' & $folder_name[1], '')
   
    ...
Next


Код: AutoIt [Выделить]
For $i = 1 To UBound($array) - 1
    $n_f = _FO_PathSplit($array[$i])
    DirCreate($path_unpack & '\' & $folder_name[1] & $n_f[0])
Next


Увидели? Если нет, то поясню. Вы начинаете перечислять пути в массиве $array, начиная с индекса 1:

Код: AutoIt [Выделить]
For $i = 1 To UBound($array) - 1


Но первый действительный путь находится под индексом 0:

Код: AutoIt [Выделить]
For $i = 1 To UBound($f_s) - 1


и

Код: AutoIt [Выделить]
$array[$i - 1] = StringRegExpReplace($f_s[$i], '.*' & $folder_name[1], '')


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

P.S.

Если хотите сохранить структуру папок, то записывайте путь в архив.
« Последнее редактирование: Март 18, 2014, 15:02:16 от Yashied »

Оффлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2949
  • Репутация: 494
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Yashied  [?]
Цитировать
Если хотите сохранить структуру папок, то записывайте путь в архив.
видимо я что то пропустил. не увидел параметра, где подразумевается запись дерева папок в архив.
насчет неверных путей, то функция должна выдавать ошибку и так весь цикл, пока не будет достигнут конец массива. но не зависать
насчет перечислений путей, то в первую папку копируются все файлы. и во вторую и так далее.
функция
Код: AutoIt [Выделить]
$f_s = _FO_FileSearch($File, '*')

возвращает массив в таком исполнении, где в первой строке находится количество строк. поэтому начинается перечисление не с нулевого индекса.
еще раз хочу сказать - если при распаковке была ошибка ( любая, которая предусмотрена самой функцией) то должен произойти выход из функции и цикл перебора массива продолжится..массив закончится и произойдет выход из общего хода распаковки или из самой программы. но происходит зависание в самой функции распаковки
« Последнее редактирование: Март 18, 2014, 15:17:06 от joiner »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
видимо я что то пропустил. не увидел параметра, где подразумевается запись дерева папок в архив
Туда же, куда и имя файла. Например так:

DirA\DirB\DirC\File.txt

Код: AutoIt [Выделить]
$f_s = _FO_FileSearch($File, '*')

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

Речь не о $f_s, а о вашем массиве $array, в котором сохраняются пути при занесении файлов в архив, начиная с индекса 0. При извлечении файлов, вы начинаете перечислять пути с индекса 1, в то время, как первый файл в архиве соответствует пути в нулевой ячейке массива. У вас получается такая картина: 1 - 0, 2 - 1, 3 - 2 и т.д., а должно быть 0 - 0, 1 - 1, 2 - 2 и т.д.

И с чего вы взяли, что функция зависает? Просто запись на диск происходит в несколько раз медленнее. В данном случае у меня получилось 2 сек на запись в архив и 5 сек на извлечение.

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

Re: Package UDF - Создание собственных PKR архивов
« Ответ #22 Отправлен: Март 18, 2014, 15:57:55 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2949
  • Репутация: 494
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Yashied  [?]
Цитировать
И с чего вы взяли, что функция зависает? Просто запись на диск происходит в несколько раз медленнее. В данном случае у меня получилось 2 сек на запись в архив и 5 сек на извлечение.
просто, 690 мб функция извлекает секунд за двадцать ( не засекал точно) а на последних 20мб происходит зависание.. файлы малого размера, да и напряг процессора внушительный для записи файла в пару мб
насчет записи пути в архив понял..завтра перепишу код..
спасибо за разъяснения

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Вообще, это все делается с помощью рекурсии примерно так:

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

Global $hPackage, $Data, $Root, $Path

$Root = FileSelectFolder('Select folder for packing.', '', 2, @ScriptDir)
If Not $Root Then
    Exit
EndIf

If _WinAPI_PathIsDirectoryEmpty($Root) Then
    MsgBox(16, 'Error', 'Folder is empty.')
    Exit
EndIf

$hPackage = _PK_Create(@ScriptDir & '\Test.pkr', '', 1)
If @Error Then
;   ConsoleWrite('Error: ' & @Error & @CR)
    Exit
EndIf

If Not _Enum($Root) Then
    ; Error
    Exit
EndIf

_PK_DisplayPackage($hPackage, $Root)

_PK_Close($hPackage)

$Root = FileSelectFolder('Select folder for unpacking archive.', '', 2, @ScriptDir)
If Not $Root Then
    Exit
EndIf

$hPackage = _PK_Open(@ScriptDir & '\Test.pkr')
If @Error Then
;   ConsoleWrite('Error: ' & @Error & @CR)
    Exit
EndIf

$Data = _PK_EnumPackets($hPackage)
If @Error Then
;   ConsoleWrite('Error: ' & @Error & @CR)
    Exit
EndIf

For $i = 1 To $Data[0][0]
    $Path = _WinAPI_PathRemoveFileSpec($Data[$i][1])
    If (Not FileExists($Root & $Path)) And (Not DirCreate($Root & $Path)) Then
        ; Error
        Exit
    EndIf
    If StringRight($Data[$i][1], 1) <> '\' Then
        _PK_ExtractPacketDataToFile($hPackage, $Data[$i][0], $Root & $Data[$i][1])
        If @Error Then
;           ConsoleWrite('Error: ' & @Error & ' - ' & $Root & $Data[$i][1] & @CR)
            Exit
        EndIf
    EndIf
Next

_PK_Close($hPackage)

ShellExecute($Root)

Func _Enum($sRoot, $sPath = '')

    Local $hSearch, $File, $Result = 1

    $hSearch = FileFindFirstFile($sRoot & '\' & $sPath & '\*')
    If $hSearch = -1 Then
        If @Error Then
            If $sPath Then
                _PK_AddPacket($hPackage, 0, 0, $sPath & '\')
                If @Error Then
;                   ConsoleWrite('Error: ' & @Error & ' - ' & $sPath & '\' & @CR)
                    Return 0
                EndIf
                Return 1
            Else
                Return 0
            EndIf
        Else
            Return 0
        EndIf
    EndIf
    While 1
        $File = FileFindNextFile($hSearch)
        If @Error Then
            ExitLoop
        EndIf
        If @Extended Then
            If Not _Enum($sRoot, $sPath & '\' & $File) Then
                $Result = 0
                ExitLoop
            EndIf
        Else
            _PK_AddPacketFromFile($hPackage, $sRoot & '\' & $sPath & '\' & $File, $sPath & '\' & $File, 1)
            If @Error Then
;               ConsoleWrite('Error: ' & @Error & ' - ' & $sPath & '\' & $File & @CR)
                $Result = 0
                ExitLoop
            EndIf
        EndIf
    WEnd
    FileClose($hSearch)
    Return $Result
EndFunc   ;==>_Enum


По поводу скорости. Эта библиотека не была предназначена для создания больших архивов с большим количеством данных. Для этого есть множество сторонних инструментов. Package UDF разрабатывалась как подспорье для упрощения проектов, написанных на AutoIt. Хороший пример использования данной библиотеки - объединение файлов оформления GUI (skin) в один архив. На данный момент падение скорости при извлечении данных будет тем больше, чем выше порядковый номер пакета (файла) в архиве.

Оффлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2949
  • Репутация: 494
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
сделал я запись путей в архив. теперь и правда стало все намного проще при распаковке.
но проблема с замедлением распаковки остается.
я упоминал уже, что запаковываю в архив множество мелковесных файлов. общий размер 700мб..число файлов 4300.
замедление происходит после распаковки 690мб. при этом распаковывается около 1500 файлов.
при этом расход системной памяти не увеличивается, но занятость процессора 50-60%.
где то функция распаковки входит в ступор,видимо..зависания нет. файлы так же распаковываются, но ,как я уже писал, очень медленно.

Yashied  [?]
Цитировать
На данный момент падение скорости при извлечении данных будет тем больше, чем выше порядковый номер пакета (файла) в архиве.
да, как раз проблема в этом. можно ли это исправить? тогда вообще был бы "шик-блеск-красота" . :)

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Программы, написанные на AutoIt, являются однопоточными и используют ЦП соответственно. Такая загрузка явялется нормальной, и говорит о том, что программа работает.

Еще раз про падение скорости. Технически, для извлечения каждого пакета необходимо сначала найти его в архиве, последовательно перечислив все пакеты, располагающиеся до искомого пакета. Таким образом получается, что чем дальше от начала файла находится извлекаемый пакет, тем больше времени потребуется на его поиск. Размер пакета особой роли не играет. Чтобы существенно сократить время поиска, нужно менять структуру архива и водить внутреннюю таблицу адресов пакетов в файле, что вызовет ряд новых проблем. В любом случае, в ближайшее время я это не планирую делать, т.к. изначально Package UDF не предназначалась для подобных задач.

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

Re: Package UDF - Создание собственных PKR архивов
« Ответ #26 Отправлен: Март 19, 2014, 04:32:36 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
7 Ответов
5224 Просмотров
Последний ответ Октябрь 02, 2012, 09:10:45
от ohos
1 Ответов
701 Просмотров
Последний ответ Сентябрь 27, 2014, 16:56:44
от CreatoR
4 Ответов
3713 Просмотров
Последний ответ Ноябрь 21, 2014, 16:01:30
от sims
0 Ответов
2658 Просмотров
Последний ответ Июль 31, 2015, 21:16:43
от Yashied
7 Ответов
2527 Просмотров
Последний ответ Сентябрь 20, 2015, 10:50:06
от joiner
11 Ответов
2942 Просмотров
Последний ответ Сентябрь 28, 2015, 11:32:36
от TorvaldGot
0 Ответов
570 Просмотров
Последний ответ Сентябрь 23, 2015, 12:22:05
от madmasles
3 Ответов
846 Просмотров
Последний ответ Ноябрь 24, 2017, 14:00:41
от Alofa
3 Ответов
1182 Просмотров
Последний ответ Декабрь 21, 2017, 15:41:42
от ra4o
0 Ответов
375 Просмотров
Последний ответ Январь 10, 2018, 01:24:25
от betauto