Конференция "Прочее" » Компонент для тестирования zip-архивов [D6, Win2k]
 
  • Валигози © (06.11.08 10:23) [0]
    Вроде бы проблем с компонентами работающими с zip-архивами быть не должно - я накачал кучу разных, но ни один не работает должным образом... :(
    Собственно мне достаточно, что бы компонент мог прочитать список заархивированных файлов (это умеют почти все компоненты что я нашёл) и что бы мог протестировать любой выбранный файл - вот здесь начинаются проблемы, одни компоненты для тестирования извлекают файлы во временную директорию, другие прямо в память и в том и в том случае возникают проблемы при тестировании больших файлов внутри архива (около гига и больше).
    Подскажите пожалуйста, есть ли (и где если есть) такая компонента которая тестировала бы файлы прямо на лету?
    (Желательно чтобы она не таскала за собой dll и была с исходными кодами)
  • tesseract © (06.11.08 10:27) [1]

    > такая компонента которая тестировала бы файлы прямо на лету


    Это как ? Для тестирования-то надо же собрать файл  по словарю.
  • Валигози © (06.11.08 10:49) [2]
    Я думаю для тестирования любого файла в zip-архиве нескольких мегабайт в памяти вполне достаточно и винду не напрягает, но если компонента для тестирования пытается выделить для гигового файла сразу всю память - я получаю "Out of memory", хотя с помощью того же WinRar'а этот архив проходит тест без запинки...
  • tesseract © (06.11.08 10:54) [3]

    > но если компонента для тестирования пытается выделить для
    > гигового файла сразу всю память - я получаю "Out of memory"


    Мне кажеться это ошибка где-то в коде. Процесс без проблем 2 гига урвать может


    > Я думаю для тестирования любого файла в zip-архиве нескольких
    > мегабайт в памяти вполне достаточно


    Вполне возможно пройдёт вариант с извлечением файла блоками в одну область памяти. Тут и 1 мегабайта может хватить.
  • Валигози © (06.11.08 10:57) [4]

    > Вполне возможно пройдёт вариант с извлечением файла блоками
    > в одну область памяти. Тут и 1 мегабайта может хватить.

    Это мне подходит :) Где бы такую компоненту раздобыть?
  • KSergey © (06.11.08 11:00) [5]
    а распаковка всегда идет в предварительно выделенный буфар памяти или есть камопненты, умеющие распаковывать в Stream?
  • Riply © (06.11.08 11:01) [6]
    > [4] Валигози ©   (06.11.08 10:57)
    > Это мне подходит :) Где бы такую компоненту раздобыть?

    А полазить по исходному коду, тех, кто тебя не устраивает,
    и на основе этого написать то что нужно не подходит ?
  • tesseract © (06.11.08 11:05) [7]

    > Где бы такую компоненту раздобыть?


    Самому часок по коду полазить, и посмотреть, где они там блоками распаковывают.
  • Валигози © (06.11.08 11:32) [8]

    > KSergey ©   (06.11.08 11:00) [5]
    > а распаковка всегда идет в предварительно выделенный буфар
    > памяти или есть камопненты, умеющие распаковывать в Stream?

    Основная масса компонентов которые я накачал умеют извлекать только в файл и всего один который умеет извлекать в поток: http://www.torry.net/quicksearchd.php?String=KAZip+v.2.0&Title=Yes
    Я даже пробовал создать своего потомка от TStream который в методе Write вообще никуда не пишет - всё равно компонент "KAZip v.2.0" вылетает на "Out of memory"... :(


    > Riply ©   (06.11.08 11:01) [6]
    > > [4] Валигози ©   (06.11.08 10:57)
    > > Это мне подходит :) Где бы такую компоненту раздобыть?
    >
    > А полазить по исходному коду, тех, кто тебя не устраивает,
    >
    > и на основе этого написать то что нужно не подходит ?


    > tesseract ©   (06.11.08 11:05) [7]
    >
    > > Где бы такую компоненту раздобыть?

    > Самому часок по коду полазить, и посмотреть, где они там
    > блоками распаковывают.

    Это понятно, благо компонентов с исходными кодами куча, корректируй какуюхоч, но вопрос же был не в этом...

    Собственно и работка эта не срочная. Просто мне каждое утро приходится составлять отчёт о том как прошла архивация баз ночью. Там и SQL'ные базы 1С... Немного напряжно WinRar'ом тестировать каждый архив вот и решил автоматизировать этот процесс... Конечно я вполне всостоянии сам разобраться с исходным кодом компонент, но думаю может уже есть нормальная, миллион раз проверенная компонента, которой все вовсю пользуются, а я один о ней ничего незнаю...

    Только что проверил вот этот архив: http://s42.radikal.ru/i098/0811/5f/5db23395d31b.jpg (это скриншот)
    При тестировании WinRar'ом, в диспетчере задач напротив его задачи память даже нешелохнулась (как было около 5 мега оперативной и около 4 мега виртуальной, так и осталась) и свободное место на диске не уменьшилось ни на байт... А при тестировании компонентой "KAZip v.2.0", на файле 1Cv7.dat вылетает в исключение "Out of memory" и моя прога в отчёте напротив этого архива логично пишет: "Архив повреждён" :(
  • Slym © (06.11.08 11:40) [9]
    в стремы умеют распаковывать?
    1. если да то можно стрем TNull написать :) и распаковывать в него: есть эксепшн - файл битый
    2. если предоставляет инфу об CRC то можно написать стрем TNullCRCCalc и распаковывать в него: CRC не совпали - файл битый
  • KSergey © (06.11.08 11:48) [10]
    Тогда вам стоит ознакомиться с консольной программой rar.exe, котрая идет в составе WinRar.
    В частности, у нее есть команда t, позволяющая тестировать архивы.
    Таким образом достатояно написать bat-файл:

    rar t *.zip|grep ошибка > errors.log



    (слово "ошибка" тут от того, что у меян русская версия WinRar)
    grep есть в бесплатных UnixTools или в дельфи (только в дельфи оно попроще, однако для этой задачи сгодится).
    Соберет имена всех файлов из архивов, в которых встретилась ошибка в файлик errors.log
    Понятно, нет предела фантазии для совершенствования (например замечено, что информацию об ошибках в архиве эта утилита выдает на stderr, чем можно воспользоваться вместо grep, для bat-файлов есть средства разделения stdout и stderr)
    Вот и все! и никаких самописных программ не надо.

    Кроме того, я не знаю чем вы пакуете, но у той же rar.exe для команды упаковки a есть так же ключик -t, позволяющий тестировать сразу после упаковки и писать соотв. диагностику, которую так же можно отлогировать.
  • KSergey © (06.11.08 11:49) [11]
    > Валигози ©   (06.11.08 11:32) [8]
    > Я даже пробовал создать своего потомка от TStream который
    > в методе Write вообще никуда не пишет - всё равно компонент
    > "KAZip v.2.0" вылетает на "Out of memory"... :(

    Я подозреваю, что у вас ошибка в программе.
    Впрочем, как выяснено, прогамма тут вовсе не нужна (самописная)
  • Валигози © (06.11.08 11:50) [12]

    > Slym ©   (06.11.08 11:40) [9]
    > в стремы умеют распаковывать?
    > 1. если да то можно стрем TNull написать :) и распаковывать
    > в него: есть эксепшн - файл битый
    > 2. если предоставляет инфу об CRC то можно написать стрем
    > TNullCRCCalc и распаковывать в него: CRC не совпали - файл
    > битый

    Я сам так думал сделать, но почемуто почти все компоненты не работают через поток, а тот который работает, всё равно резервирует в памяти кучу места даже если я отправляю распаковку в поток, который в методе Write вообще никуда ничего не пишет... :(
  • tesseract © (06.11.08 12:08) [13]

    > rar t *.zip|grep ошибка > errors.log


    grep вроде борландовская штука ?
  • Валигози © (06.11.08 12:13) [14]

    > KSergey ©   (06.11.08 11:48) [10]
    > Тогда вам стоит ознакомиться с консольной программой rar.
    > exe, котрая идет в составе WinRar.
    > В частности, у нее есть команда t, позволяющая тестировать
    > архивы.

    А как получить список файлов в архиве? Использовать компоненту для получения списка файлов а для тестирования утилиту запускать? Да и таскать за собой утилиты... Както кривизной попахивает... Лучше я тогда подправлю один из компонентов чтобы он работал в поток....


    > Кроме того, я не знаю чем вы пакуете, но у той же rar.exe
    > для команды упаковки a есть так же ключик -t, позволяющий
    > тестировать сразу после упаковки и писать соотв. диагностику,
    >  которую так же можно отлогировать.

    Архивирует специальная утилита - APBackUp называется. Архиватор у неё встроенный (я так думаю), а отчёт я вывожу в файл Excel.


    > KSergey ©   (06.11.08 11:49) [11]
    > > Валигози ©   (06.11.08 11:32) [8]
    > > Я даже пробовал создать своего потомка от TStream который
    >
    > > в методе Write вообще никуда не пишет - всё равно компонент
    >
    > > "KAZip v.2.0" вылетает на "Out of memory"... :(
    >
    > Я подозреваю, что у вас ошибка в программе.
    > Впрочем, как выяснено, прогамма тут вовсе не нужна (самописная)

    Ошибку "Out of memory" даёт не моя прога, а компонент "KAZip v.2.0" - единственный из тех что я нашёл который умеет извлекать файлы в поток (TStream) - и то как выясняется криво...

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

    Кстати, а почему эту тему перенесли в "Прочее"? Я посмотрел, в этом форуме почти все темы не относящиеся к Delphi... А мой вопрос всё же очень тесно относится к Delphi... Хм... Какие же тогда вопросы можно задавать в "Основной"...
  • Riply © (06.11.08 12:17) [15]
    > [14] Валигози ©   (06.11.08 12:13)
    > Кстати, а почему эту тему перенесли в "Прочее"? Я посмотрел, в этом форуме почти все темы не относящиеся к Delphi...
    > А мой вопрос всё же очень тесно относится к Delphi... Хм...
    > Какие же тогда вопросы можно задавать в "Основной"...

    В "Основной" спрашивают "как решить?", а ты спросил: "где найти ?".
    Есть разница ? :)
  • Slym © (06.11.08 12:23) [16]
    внутри идет работа с мемстримом :(
    function TKAZipEntriesEntry.Test: Boolean;
    Var
     FS : TFileStream;
     MS : TMemoryStream;
     FN : String;
    begin
     Result  := True;
     Try
       if NOT FIsEncrypted Then
          Begin
            if FParent.FParent.FUseTempFiles  Then
               Begin
                 FN := FParent.FParent.GetDelphiTempFileName;
                 FS := TFileStream.Create(FN,fmOpenReadWrite or FmCreate);
                 Try
                   ExtractToStream(FS);
                   FS.Position := 0;
                   Result      := FParent.CalculateCRCFromStream(FS) = CRC32;
                 Finally
                   FS.Free;
                   DeleteFile(FN);
                 End;
               End
            Else
               Begin
                 MS := TMemoryStream.Create;
                 Try
                   ExtractToStream(MS);
                   MS.Position := 0;
                   Result      := FParent.CalculateCRCFromStream(MS) = CRC32;
                 Finally
                   MS.Free;
                 End;
               End;
          End;
     Except
       Result  := False;
     End;
    end;

  • Валигози © (06.11.08 12:30) [17]

    > Slym ©   (06.11.08 12:23) [16]
    > внутри идет работа с мемстримом :(

    Я знаю... Я изучал исходники этого компонента... Скорее всего переделывать я буду не этот компонент... Чтото уж слишком у него там всё наворочено...


    > Riply ©   (06.11.08 12:17) [15]
    > > [14] Валигози ©   (06.11.08 12:13)
    > > Кстати, а почему эту тему перенесли в "Прочее"? Я посмотрел,
    >  в этом форуме почти все темы не относящиеся к Delphi...
    >  
    > > А мой вопрос всё же очень тесно относится к Delphi...
    > Хм...
    > > Какие же тогда вопросы можно задавать в "Основной"...
    >
    > В "Основной" спрашивают "как решить?", а ты спросил: "где
    > найти ?".
    > Есть разница ? :)

    Вобщем то разница есть, но всё же не такая большая как между "Где найти компоненту для Delphi?"  и например "Какой ноутбук купить?". Если бы я на этом форуме отвечал бы на вопросы (в качестве эксперта Delphi :) ), то вжизни не зашёл бы на эту часть форума...
  • KSergey © (06.11.08 12:33) [18]
    > Валигози ©   (06.11.08 12:13) [14]
    > А как получить список файлов в архиве? Использовать компоненту
    > для получения списка файлов а для тестирования утилиту запускать?
    >  Да и таскать за собой утилиты... Както кривизной попахивает.

    А типа не судьба попробовать приведенную мною однострочную команду и убедиться, что она тестирует ВСЕ файлы в расширением zip в текущей директории и ВСЕ файлы внутри архива? Ну да, чукча писатель: нашлепать никчемную прогу (в смысле тут ен нужную) - это проще, чем почитать хелпы.

    > Валигози ©   (06.11.08 12:13) [14]
    > .. Нет никакого смысла вызывать внешние утилиты, использовать dll и т.п.

    Да да да, своя программа - это, конечно же, не сторонняя утилита, ага 3 раза.
    вы решаете явно задачу администрирования, а для нее дельфи не нужны, как правило. Все решается bat-файлами и уже готовыми тулзами.

    А зачем вообще эта APBackUp нужна? Все те же самые задачи (включая "n последних копий" я сделал просто bat-файлом, запускающимся по расписанию опять же штатными виндовыми средствами.
  • brother © (06.11.08 12:39) [19]
    > Все те же самые задачи (включая "n последних копий" я сделал
    > просто bat-файлом, запускающимся по расписанию опять же
    > штатными виндовыми средствами.

    батник можно посмотреть?
 
Конференция "Прочее" » Компонент для тестирования zip-архивов [D6, Win2k]
Есть новые Нет новых   [134446   +31][b:0][p:0.002]