Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа с TVCLZip


Автор: killerbean 1.12.2006, 09:20
Столкнулся с непонятной проблемой, не могу распаковать архив TVCLZip'ом. Использую следующий код:

Код

unarchivate := TVCLUNZip.Create(nil);
unarchivate.ZipName := InBox + '\archive.zip';
unarchivate.DestDir := InBox + '\';
unarchivate.RetainAttributes := True;
Ret := unarchivate.UnZip;
ShowMessage(IntToStr(Ret));
unarchivate.Free;


Путь существует, архив перед вызовом этого кода на месте. Вроде всё делал по хелпу, но не распаковывает ни в какую. Как решить вопрос?

Автор: PROeXT 1.12.2006, 10:37
Ошибки какие-нибудь вылетают или все проходит "втихую"? 

Да... И строка
Код

unarchivate := TVCLUNZip.Create(nil);

Может, стоит попробовать передать в качестве владельца реально существующий компонент? 

Автор: killerbean 1.12.2006, 10:40
Ошибок нет. unarchivate.UnZip возвращает 0, т.е. ничего не разархивировал  smile 

Пробовал и реальный компонент (код тот же только без Create и Free), эффект тот же

Автор: Romikgy 1.12.2006, 12:45
Код

procedure TForm1.Button1Click(Sender: TObject);
var unarchivate:TVCLUnZip;
InBox: string;
 sl:TStringList;
Ret: LongInt;
begin
unarchivate := TVCLUNZip.Create(nil);
unarchivate.ZipName := InBox + '\archive.zip';
unarchivate.DestDir := InBox + '\';
unarchivate.RetainAttributes := True;
sl:= TStringList.Create;
sl.Clear;
sl.Add('*.*');
unarchivate.FilesList:=sl;
sl.Free;
Ret := unarchivate.UnZip;
ShowMessage(IntToStr(Ret));
unarchivate.Free;
end;

Автор: killerbean 1.12.2006, 13:20
Romikgy этот код у вас работает? У меня нет. 
В документации написано, что если не передавать в список файлов маски, то будет распакован весь архив (что мне и нужено).

Автор: Romikgy 1.12.2006, 13:36
Цитата(killerbean @  1.12.2006,  12:20 Найти цитируемый пост)
этот код у вас работает? У меня нет. 

У меня да
у мя версия 
VCLZip Native Delphi Zip/UnZip Component! (Version 2.03 Mar 10, 1998)
и если порытся в исходниках, то видно , что 
Код

constructor TVCLUnZip.Create( AOwner: TComponent );
....
FFilesList := TStringList.Create;

и
Код

function TVCLUnZip.UnZip: Integer;

Result := UnzipFiles(theZipFile);

function TVCLUnZip.UnZipFiles( zip_in_file: TStream ): Integer;

While (i < FFilesList.Count) do 

и если здесь FFilesList.Count равно нулю то ничего не распаковывается!

PS по всем исходникам VCLZip больше нигде нет работы с FFilesList

Автор: killerbean 1.12.2006, 13:53
Понятно, но у меня всё равно unarchivate.UnZip возвращает 0. 
Я в кодах пока не разберался но в оффициальной документации в разделе описания распаковки написано следующее:

Код

If you simply wish to extract all files from a particular zip file it is as easy as just specifying the ZipName and DestDir properties and then call the UnZip method.  That's it.


из этих слов получаеться, что не обязательно указывать список файлов, хотя хоть указую хоть нет, распаковка не происходит  smile 

PS. Версия VCLZip Pro v3.06.2 for Delphi BCB

Автор: Romikgy 1.12.2006, 13:58
Цитата(killerbean @  1.12.2006,  12:53 Найти цитируемый пост)
Версия VCLZip Pro v3.06.2 for Delphi BCB

где взять?

Автор: Snowy 1.12.2006, 14:10

M
Snowy
killerbean, вверху страницы написаны правила.
Будь добр - прочитай их.
Первый и второй пункты выделены жирным шрифтом.

Автор: killerbean 1.12.2006, 14:28
извините, очень спешил, такого больше не повториться

Автор: Romikgy 1.12.2006, 14:49
Код

property DoAll : Boolean 

Description 

If set to True then all files in the zipfile will be extracted when the UnZip Method is called. 

Код

unarchivate.DoAll:=true;

попробуй так!

Автор: killerbean 1.12.2006, 14:53
Не помогает,  я уже даже и не знаю, что делать  smile 

Автор: Snowy 1.12.2006, 15:01
Возьми бесплатную вторую версию smile

Добавлено @ 15:02 
http://files.vingrad.ru/Snowy/component/VCLZip.rar

Автор: Romikgy 1.12.2006, 15:02
Код

unarchivate.FilesList. Add ('*.*');

и так не работает?

Автор: killerbean 1.12.2006, 15:10
Не выходит. На данный момент код имеет следующий вид:
Код

var
  Ret: Integer;
  unarchivate : TVCLUnZip;
  sl:TStringList;
begin
    unarchivate := TVCLUNZip.Create(nil);
    unarchivate.ZipName := InBox + '\archive.zip';
    unarchivate.DestDir := InBox + '\';
    unarchivate.RetainAttributes := True;
    sl:= TStringList.Create;
    sl.Clear;
    sl.Add('*.*');
    unarchivate.FilesList:=sl;
    sl.Free;
    unarchivate.DoAll := True;
    Ret := unarchivate.UnZip;
    ShowMessage(IntToStr(Ret));
    unarchivate.Free;
end;


Тогда щас буду пробовать 2-ю версию. Надо же как-то выходить из сложившейся ситуации.

Автор: Snowy 1.12.2006, 15:40
Код

//uses VCLUnZip;

var
  Ret: Integer;
  zip : TVCLUnZip;
begin
  zip := TVCLUnZip.Create(nil);
  zip.ZipName := Inbox + '\archive.zip';
  zip.DestDir := Inbox + '\unzip';
  zip.FilesList.Add('*.*');
  try Ret := zip.UnZip; except end;
  ShowMessage(IntToStr(Ret));
  zip.Free;
end;
Без проблем работает с бесплатной версией smile

Автор: killerbean 1.12.2006, 15:47
ага и у меня теперь всё вышло. Спасибо всем.

PS. Долбаные взломщики, из-за ни пол дня потерял smile (сам конечно виноват). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)