[Delphi Abbrevia][pilne]Kasowanie archiwum po wypakowaniu

0

Witam, krótkie pytanie mam do Was:D

Mam komponenu AbUnZipper z pakietu Abbrevia. Wszystko ladnie dziala, ale chcialbym aby program po rozpakowaniu kasował plik *.zip Nie moge nigdzie znalezc zdarzenie gdy komponent konczy rozpakowywanie(jak daje DeleteFile() zaraz po zgłoszeniu rozpakowywania to sie nie kasuje:D)

Pliz o pomoc;D

0

nie instaluje tego bo nie mam czasu ale oblookalem zrodelko i moze sprobuj w OnArchiveProgress sprawdzac czy postep = 100% :)

0

No juz tego probowalem, ale nie idzie;/

0
Axadiw napisał(a)

No juz tego probowalem, ale nie idzie;/

Bylbym wdzieczny gdybys opisal problem "nie iscia" bardziej szczeglowo

0

A może po zakończeniu rozpakowywania poczekaj chwilę i wtedy kasuj (albo Timerek, albo sleep()) :)

0

ok, juz pisze:
do sciaganiea uzywam procedury ktora wyglada tak:

procedure rozpakuj(url:string);
begin
patcher.AbUnZipper1.FileName := ExtractFileDir(sciezka) + '\' + url;
patcher.AbUnZipper1.BaseDirectory := ExtractFilePath( ExtractFileDir(sciezka) + '\' + url );
patcher.AbUnZipper1.ExtractFiles( '*.*' );
end;

patcher to nazwa formularza, ExtractFileDir(sciezka) to katalog w ktorym sie wszystko odbywa.

Teraz tak: mam uzywam komponentu Httpget do sciagania plikow. Istnieje tam zdarzenie OnDoneFile (czy jakos tak:D), gdzie pisze

rozpakuj(httpget.FileName);
deletefile(httpget.filename)

to nie działało, więc probowalem kombinować z samym komponentem AbUnZip(i progressem)

procedure TPatcher.AbUnZipper1ArchiveProgress(Sender: TObject;
  Progress: Byte; var Abort: Boolean);
begin

if Progress <= 100 then DeleteFile(AbUnZipper1.FileName);
end;<delphi>



to tez nie działa, po prostu plik cały czas siedzi na dysku;/</delphi>

0

Axadiw napisał(a)

Ekhm... Ty probujesz usunac plik jesli postep jest mniejszy lub rowny 100... sprobuj usunac jest rowny 100! Zreszta, zdebuguj se i zobacz jakie wartosci przyjmuje progress (skoro jest to byte to zapewne 0..100 czyli procentowe, ale niekoniecznie, moze to byc np. ilosc plikow!)

0

fakt zmienilem <= na >= i to samo jest.

Aha, zrobilem zeby mi do etykiety przypisywal wartość progress i pod koniec wychodzilo 100 lub więcej!!(nie wiem do konca dla czego:D), w archiwach są pojedyncze pliki

0
Axadiw napisał(a)

fakt zmienilem <= na >= i to samo jest.

Aha, zrobilem zeby mi do etykiety przypisywal wartość progress i pod koniec wychodzilo 100 lub więcej!!(nie wiem do konca dla czego:D), w archiwach są pojedyncze pliki

i wiecej? :> To dziwne... IMO postep procentowy powinien sie konczyc na 100!... Hmm.. a nie powinienes przed DeleteFile wywolac

abunzipper1.CloseArchive

?

0

hmmm....cos w tym jest:D

Powiedz, mowiles cos o debugowaniu, jak Twoim zdaniem sprawdzic maxymalny progress?

0
Axadiw napisał(a)

hmmm....cos w tym jest:D

Powiedz, mowiles cos o debugowaniu, jak Twoim zdaniem sprawdzic maxymalny progress?

Dwie mozliwosci:
postaw breakpointa i sprawdzaj przy kazdym update progressu wartosc zmiennej (troche se poklikasz bo update jest pewno co 1 zmiane)
albo daj label1.caption:=inttostr(progress) - to ci powinno dac maksymalny progress po zakonczeniu unzipowania (chyba ze program po skonczeniu wywoluje jeszcze raz to zdazenie z wartoscia 0 albo -1 - wtedy trza sie zabezpieczyc instrukcja warunkowa)

0

No to maxymalna wartosc to 100, lecz gdy daje close archive i kasowanie (na if progress=100) to error wyskakuje;/ Probowalem tez z abunzipper1.free - to samo.

Teraz pokombinuje tak na około - po scaignieciu pliku do odpowiedniej tablicy jest wpisywana nazwa pliku.
w tle dziala timerek(1ms) i sprawdza czy aktualnie rozpakowywany plik jest rozny od tej w tablicy(rozpakowywane pliki beda kolejkowane), jesli tak to sproboje go skasowac, tylko na razie nie wychodzi jeszcze:D

jakies sugesti moze? jest naprawde bardzo poczatkujacy to wiele nie umiem

0

A więc tak:
udało mi się rozwiącac ten problem w połowie:
mianowicie kasują sie wszystkie pliki poza ostatnim, ten abunzipper1 po prostu trzyma go i nie chce puścic:D

Oto jak to teraz wyglada

httpget(po sciagnieciu pliku):

//rozpakowywanie
rozpakuj(httpget.FileName);
inc(ile);
co[ile] := Abunzipper1.FileName;

tablica co zawiera adresy plikow do wypakowania, zmienna ile iczbe tych plików.

teraz timer(1ms):

if (co[1] <> '')
AND (co[1] <> AbUnZipper1.FileName)
then
  begin
if (co[1] <> '') AND (kolejka_ile = 0) then
 begin
abunzipper1.Free;
  deletefile(co[1]);
  label1.Caption := 'Ukończono!';
 end;
deletefile(co[1]);
for u:=1 to 10000 do co[u] := co[u+1];
  end;

Wszystko fajnie, tylko jak mam zmusic ten AbUzZipper zeby "puścił" ostatni plik??
Probowalem .Free , .Destroy, .CloseArchive. Jak na zaden pomysl nie wpadne to moze po prostu tego archiwera zmusic do jakiegos kolejnego pliku to ten ważny "puści" :D

0

Zadne Free! W ten sposob kasujesz komponent... Destroy tez... jedynie CloseArchive jest metoda tego obiektu a reszta to metody TObject czy na czym to bazuje...
A w dokumentacji nic o closearchive nie ma? BTW Sprobuj tescik przeprowadzic - jak progress= 100 procent daj closearchive i np. showmessage (to wstrzyma program dopuki nie nacisniesz OK) i sprobuj recznie skasowac plik... Jak sie nie da to znaczy ze wina jest po stronie komponentu... A jak sie da to znaczy ze cos nie tak robimy ;)

0

Wlasnie do abbrevia nie moge znalezc dokumentacji(sic!:D), nie byla dolaczona ani w necie nie moge znalezc, moze ktos wie cos o niej?:D

Aha, CloseArchive nic nie daje;/

DODANE:

Aha, jak zrobilem tak jak powiedziales(if progress =100 then begin abunzipper1.closearchive; showmessage('dupa'); end;) to MOGE skasowac recznie ten plik....juz nie wiem o co chodzi:D

0
Axadiw napisał(a)

Aha, jak zrobilem tak jak powiedziales(if progress =100 then begin abunzipper1.closearchive; showmessage('dupa'); end;) to MOGE skasowac recznie ten plik....juz nie wiem o co chodzi:D

dokumentacja//sourceforge.net/project/showfiles.php?group_id=71001&package_id=76077

Sprobuj po tym showmessage dac deletefile - poniewaz rozpakowywanie jest na 99% w watku to byc moze program nie czeka az watek zakonczy wykonywanie closearchive

0

No i poradziłem sobie:D

W sposob dosc brutalny, ale działa:D

w tym timerku kod jest taki:

if koniec then
 begin
 abunzipper1.CloseArchive;
  label1.Caption := 'Ukończono!';
  for u:=1 to ile do deletefile(co[u]);
  end
  else
for u:=1 to ile do deletefile(co[u]);

Zmienna koniec jest ustawiana na true po pomyślnym pobraniu całego pliku.

Wszystko działa, nie wiem co było wczesniej nie tak, ale ten sposob jest prostszy szybszy itp:D (do tablicy "co" dodaje tylko wpisy, nie kasuje ich)

Migajek, wielkie thx za pomoc:D

0

nie lepiej

repeat
 DeleteFile(...);
 Application.ProcessMessages;
 Sleep(1);
until
 not FileExists(...)

?

1 użytkowników online, w tym zalogowanych: 0, gości: 1