Autor Téma: Komprimace pomocí TAbMakeCab končí chybou  (Přečteno 581 krát)

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 204
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Komprimace pomocí TAbMakeCab končí chybou
« kdy: 09-10-2019, 14:39:12 »
Zdravím všechny!
V poslední době jsem se začal setkávat s chybou během komprimace souboru pomocí TAbMakeCab (Abbrevia 5.36). Nezkomprimovaný soubor má velikost asi 3 GB a během komprimace nastane error s hlášením: FCI cannot add file. Menší soubory se zkomprimují bez chyby. Program má 32 bit architekturu, jde o rozsáhlý projekt, který nejde jen tak překlopit na 64 bit (komponenty cizích stran, atd...)
Víte, prosím, někdo o nějakém velikostním omezení u této komponenty?
Dá se to nějak nastavit/obejít?
Je nějaká novější verze, která funguje v DXE6? Mám totiž ještě verzi 10.0, ale ta nejde v DXE6 zkompilovat.
Máte tip na nějakou úplně jinou komponentu pro komprimaci, která zvládne i veliké soubory?
Díky, K.

Online Jirka

  • Plnoletý
  • ***
  • Příspěvků: 150
  • Karma: 8
    • Verze Delphi: XE2
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #1 kdy: 09-10-2019, 14:56:21 »

Máte tip na nějakou úplně jinou komponentu pro komprimaci, která zvládne i veliké soubory?

Třeba toto ?  (jen jsem to našel - zkušenosti nemám)
https://synopse.info/forum/viewtopic.php?pid=163

případně ještě 7-zip ..

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2349
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #2 kdy: 09-10-2019, 15:00:03 »
zkus System.Zip a v nem TZipFile primo z Delphi - http://docwiki.embarcadero.com/Libraries/Rio/en/System.Zip.TZipFile
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2349
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #3 kdy: 09-10-2019, 15:02:37 »
Embarcadero MVP - Czech republic

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 204
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #4 kdy: 09-10-2019, 15:44:24 »
Díky za tip, otestuji.
K.

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 185
  • Karma: 11
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #5 kdy: 09-10-2019, 17:34:48 »
Ten subor sa komprimuje v pamati a potom zapisuje na disk?

Moze ist o 2 GB (3GB) memory limit pre 32bit proces: https://superuser.com/questions/1163749/why-do-32-bit-processes-have-a-2-gb-ram-limit

Alebo ak ide o kniznicu vyuzivajucu C/C++ metody tak moze ist o limit pre fseek a ftell: https://stackoverflow.com/questions/4003405/32-bit-windows-and-the-2gb-file-size-limit-c-with-fseek-and-ftell
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 185
  • Karma: 11
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #6 kdy: 09-10-2019, 17:46:03 »
Ten subor sa komprimuje v pamati a potom zapisuje na disk?

Moze ist o 2 GB (3GB) memory limit pre 32bit proces: https://superuser.com/questions/1163749/why-do-32-bit-processes-have-a-2-gb-ram-limit

Alebo ak ide o kniznicu vyuzivajucu C/C++ metody tak moze ist o limit pre fseek a ftell: https://stackoverflow.com/questions/4003405/32-bit-windows-and-the-2gb-file-size-limit-c-with-fseek-and-ftell

Bavime sa o tomto komponente https://github.com/TurboPack/Abbrevia/ ?

Skusal si pozriet Issues? Presne je to tam spomenute: https://github.com/TurboPack/Abbrevia/issues/6

Pozrel som is aj zdrojaky a pouzivaju bzip, zlib, ... kompresie (napisane v C), co znamena, ze mozu mat presne ten isty proglem (2 GB limit) ako instalatory NSIS: http://forums.winamp.com/showthread.php?t=452975
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2349
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #7 kdy: 09-10-2019, 21:57:58 »
Ten subor sa komprimuje v pamati a potom zapisuje na disk?

Moze ist o 2 GB (3GB) memory limit pre 32bit proces: https://superuser.com/questions/1163749/why-do-32-bit-processes-have-a-2-gb-ram-limit

Alebo ak ide o kniznicu vyuzivajucu C/C++ metody tak moze ist o limit pre fseek a ftell: https://stackoverflow.com/questions/4003405/32-bit-windows-and-the-2gb-file-size-limit-c-with-fseek-and-ftell


Na 64bit windows i 32bit Delphi aplikace muze mit dostupne cca 4GB - dukaz a navod https://delphi.cz/post/Zvetseni-dostupne-pameti-32bit-programech-v-Delphi-IMAGE_FILE_LARGE_ADDRESS_AWARE.aspx


Embarcadero MVP - Czech republic

Offline František

  • Guru
  • *****
  • Příspěvků: 519
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #8 kdy: 09-10-2019, 23:02:48 »
a nie je mozne to rozsekat na napr. gigove splity?

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 204
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #9 kdy: 10-10-2019, 08:22:54 »
Bavime sa o tomto komponente https://github.com/TurboPack/Abbrevia/ ?
Skusal si pozriet Issues? Presne je to tam spomenute: https://github.com/TurboPack/Abbrevia/issues/6
Ano, jde o tuto komponentu. Jen jsem ji měl ještě mnohem dřív, než se dostala na GitHub. Používal jsem ji už před mnoha lety v Delphi 7, a když jsme přešli na DXE6, našel jsem verzi 5.36, která v této verzi fungovala. A zase 4 roky spokojenost. Do velikosti cca 2GB funguje všechno OK i teď, chyba vyskočí při velikosti 3GB a více. Takto veliké soubory se nám objevili až v poslední době, tak to chci vyřešit. Zřejmě narážím na nějaký limit v 32bit programu.
Nemusím nutně používat tuto komponentu. Kdyby však někdo napsal, jak to "snadno a rychle" překonat, tak se podle toho zařídím. Nyní si chci udělat testy na ZipFile přímo v Delphi. Cabinety jsme dělali, protože měli dobrý poměr rychlost/velikost po kompresi, u zipu to bylo horší. Buď byl zip rychlejší, ale komprese slabá nebo naopak.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 204
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #10 kdy: 10-10-2019, 16:19:18 »
Testoval jsem a z výsledků jsem rozpačitý. Abych byl více v současnosti, použil jsem Delphi 10.2 Tokyo, 64bit architekturu. Udělal jsem si nejjednodušší testovací procedury, jednou s TZipFile, podruhé s TAbMakeCab, ten jsem stáhnul dnes z GitHub.
TAbMakeCab v Tokyo nedokáže zapakovat soubor o velikosti 2,94GB. Možná nemám někde něco zapnuté pro 64bit, ale nevím co. Rád se nechám poučit, myslel jsem, že stačí přidat Target platform 64bit Windows a aktivovat.
ZipFile zapakuje soubor o velikosti 3,91GB, to je lepší. Ale větší 4,78GB už nezabalí celý, dokonce ani neudělá chybu, jen se procedura ukončí, v logu se zobrazí hotovo. Soubor v archivu je však useknutý, má chybný checksum a nejde vybalit.
Přikládám testovací procedury:
Kód: Delphi [Vybrat]
  1. var
  2.   aCabWr : TAbMakeCab;
  3.   cil: string;
  4. begin
  5.   cil := 'c:\a\pokus.cab';
  6.   Log('zacatek');
  7.   aCabWr := TAbMakeCab.Create(nil);
  8.   Try
  9.     aCabWr.CompressionType := ctMSZIP;
  10.     aCabWr.StoreOptions := [soStripDrive,soStripPath,soRemoveDots];
  11.     if FileExists(cil) then
  12.       DeleteFile(cil);
  13.     aCabWr.OpenArchive(cil);
  14.     aCabWr.AddFiles(zdroj, 0);
  15.  
  16.     aCabWr.CloseArchive;
  17.     Log('hotovo');
  18.   Except
  19.     on E: Exception do begin
  20.       Log('Při zálohování došlo k chybě:'+e.Message);
  21.     end;
  22.   End; // Try, Except
  23.   aCabWr.Free;
  24.  
Kód: Delphi [Vybrat]
  1. var
  2.   pak: TZipFile;
  3.   cil: string;
  4. begin
  5.   cil := 'c:\a\pokus.zip';
  6.   pak := TZipFile.Create;
  7.   try
  8.     try
  9.       Log('zacatek');
  10.       if FileExists(cil) then
  11.         DeleteFile(cil);
  12.       pak.Open(cil, zmWrite);
  13.       pak.Add(zdroj);
  14.       pak.Close;
  15.  
  16.       Log('hotovo');
  17.     except on E: Exception do
  18.       begin
  19.         Log('Chyba: '+e.Message);
  20.       end;
  21.     end;
  22.   finally
  23.     FreeAndNil(pak);
  24.   end;
  25.  
Pokračovat budu až po neděli, protože zítra a o víkendu jsem na cestách.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #11 kdy: 10-10-2019, 20:20:33 »
Excellent
Rated 1 time
ZIP soubor má všude možně limity na 4 GB, protože všechna čísla v něm jsou 32bitová. Týká se to celkové velikosti archívu (tzn. po kompresi), ale i nekomprimovaných velikostí každého jednotlivého souboru. Detaily např. zde: https://en.wikipedia.org/wiki/Zip_(file_format)

U CAB nevím, nikdy jsem ho nepoužíval. Nebyl bych překvapen, kdyby tam byl podobný limit.

Pokud je požadavek na větší soubory, mohu doporučit 7-zip, ten má všechna čísla 64bitová a na jejich limity hned tak nenarazíme. Z Delphi se dá překvapivě dobře ovládat - navenek to možná vypadá strašidelně, ale po troše experimentování to vůbec není složité. Nevýhodou je nutnost s aplikací přibalovat i 7z.dll.

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 185
  • Karma: 11
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #12 kdy: 14-10-2019, 10:56:06 »
Testoval jsem a z výsledků jsem rozpačitý. Abych byl více v současnosti, použil jsem Delphi 10.2 Tokyo, 64bit architekturu. Udělal jsem si nejjednodušší testovací procedury, jednou s TZipFile, podruhé s TAbMakeCab, ten jsem stáhnul dnes z GitHub.

Prepnut konfiguraciu na 64 bit nestaci :) Ide prave o to, prerobit vsetky tie "cisla" na 64 bitov atd., ako pisal pepak (inak je to zaujimave citanie):

Citace
ZIP soubor má všude možně limity na 4 GB, protože všechna čísla v něm jsou 32bitová. Týká se to celkové velikosti archívu (tzn. po kompresi), ale i nekomprimovaných velikostí každého jednotlivého souboru. Detaily např. zde: https://en.wikipedia.org/wiki/Zip_(file_format)

Zhrnutie: Dana chyba sa da opravit len prerobenim kniznice do 64 bitov.

Ale prerobit tie kniznice CAB, pripadne ZIP na 64 bitov je uz mimo rozsah tohto fora, cize jednoduchsie bude pouzit ten 7Zip a hotovo.
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 204
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #13 kdy: 14-10-2019, 11:17:18 »
Ano, podívám se na 7z.dll. O své vůli něco předělávat z 32bit na 64bit nebudu, na to nemám znalosti ani čas.
Jsem si tak naivně myslel, že když TZipFile je v Delphi od XE2, tak ve verzi 10.2 Tokyo už by mohl být předělaný i na 64bit, když už je tak dlouho možnost vytvářet 64bit programy.
K.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:Komprimace pomocí TAbMakeCab končí chybou
« Odpověď #14 kdy: 14-10-2019, 16:05:37 »
Ale to přece vůbec není o tom, jestli knihovna je nebo není 64bitová! Jde o to, že formát souboru má pouze 32bitová čísla. S tím by přepsání knihovny nijak nehnulo, i kdybys to napsal "128bitově", tak ten formát pořád bude limitovat velikost. Pokud se s tím má něco stát, je nutné změnit formát, tzn. příjít s variantou ZIPu, která bude mít 64bitové číselné údaje. Ale to je samozřejmě absolutně nereálné - sice to teoreticky jde udělat (a nezáleží přitom na bitovosti knihovny), ale nikdo z nás nedokáže takhle upravený formát prosadit. Prostě ZIP je široce rozšířený standard a s tím se nedá hnout (stačí se podívat např. na mnohaleté snahy o nahrazení JPEG lepšími formáty).

Co jsem se díval, tak CAB také má 32bitové limity, akorát posazené trochu jinak. Jestli jsem to dobře pochopil, tak v něm lze mít až 15 "bloků" o komprimované velikosti 4 GB s tím, že jeden soubor nemůže být ve víc blocích.

Takže doporučuju použít ten formát 7z, ten má limity nastavené rozumněji.