//////////////////////////////////////////////////////////////////////////////// // // **************************************************************************** // * Project : FWZip // * Unit Name : CreateZIPDemo1 // * Purpose : Äåìîíñòðàöèÿ ñîçäàíèÿ àðõèâà èñïîëüçóÿ ðàçëè÷íûå // * : âàðèàíòû äîáàâëåíèÿ äàííûõ // * Author : Àëåêñàíäð (Rouse_) Áàãåëü // * Copyright : © Fangorn Wizards Lab 1998 - 2013. // * Version : 1.0.10 // * Home Page : http://rouse.drkb.ru // * Home Blog : http://alexander-bagel.blogspot.ru // **************************************************************************** // * Stable Release : http://rouse.drkb.ru/components.php#fwzip // * Latest Source : https://github.com/AlexanderBagel/FWZip // **************************************************************************** // // Èñïîëüçóåìûå èñòî÷íèêè: // ftp://ftp.info-zip.org/pub/infozip/doc/appnote-iz-latest.zip // http://zlib.net/zlib-1.2.5.tar.gz // http://www.base2ti.com/ // // Äàííûé ïðèìåð ïîêàçûâàåò ðàçëè÷íûå âàðèàíòû äîáàâëåíèÿ èíôîðìàöèè â àðõèâ // Äëÿ êàæäîãî èç ñïîñîáîâ äîáàâëåíèÿ â àðõèâå áóäåò ñîçäàíà îòäåëüíàÿ ïàïêà program CreateZIPDemo1; {$APPTYPE CONSOLE} uses SysUtils, Classes, TypInfo, zlib, FWZipWriter; procedure CheckResult(Value: Integer); begin if Value < 0 then raise Exception.Create('Îøèáêà äîáàâëåíèÿ äàííûõ'); end; var Zip: TFWZipWriter; S: TStringStream; PresentFiles: TStringList; SR: TSearchRec; I, ItemIndex: Integer; BuildZipResult: TBuildZipResult; begin SetCurrentDir(ExtractFilePath(ParamStr(0))); try Zip := TFWZipWriter.Create; try // Ó âñåãî àðõèâà âêëþ÷èì UTF8 êîäèðîâêó (åñëè íåîáõîäèìî) Zip.UseUTF8String := True; // äîáàâèì êîììåíòàðèé ïî íåîáõîäèìîñòè Zip.Comment := 'Îáùèé êîììåíòàðèé ê àðõèâó'; // Ñíà÷àëà äîáàâèì â àðõèâ ôàéëû è ïàïêè // íå ñóùåñòâóþùèå ôèçè÷åñêè íà äèñêå // Ñîçäàåì è äîáàâëÿåì òåêñòîâûé ôàéë â êîðåíü àðõèâà (AddStream) S := TStringStream.Create('Òåñòîâûé òåêñòîâûé ôàéë ¹1'); try S.Position := 0; ItemIndex := Zip.AddStream('test.txt', S); CheckResult(ItemIndex); // Ìîæíî äîáàâèòü êîìåíòàðèé ê ñàìîìó ýëåìåíòó Zip.Item[ItemIndex].Comment := 'Ìîé òåñòîâûé êîììåíòàðèé'; //TCompressionStream.Create(clDefault, S); finally S.Free; end; // Äëÿ ñîõðàíåíèè ôàéëà â îïðåäåëåííîé ïàïêå // äîñòàòî÷íî óêàçàòü åå íàëè÷èå â ïóòè ê ôàéëó, íàïðèìåð âîò òàê S := TStringStream.Create('Òåñòîâûé òåêñòîâûé ôàéë ¹2'); try S.Position := 0; CheckResult(Zip.AddStream( 'AddStreamData\SubFolder1\Subfolder2\Test.txt', S)); finally S.Free; end; // Òåïåðü áóäóò ïîêàçàíû ïÿòü âàðèàíòîâ äîáàâëåíèÿ ôàéëîâ // ôèçè÷åñêè ïðèñóòñòâóþùèõ íà äèñêå // Âàðèàíò ïåðâûé: // äîáàâëÿåì â àðõèâ ñîäåðæèìîå ïàïêè "Create ZIP 2" âûçîâîì // áàçîîâãî ìåòîäà AddFolder if Zip.AddFolder('..\Create ZIP 2\') = 0 then raise Exception.Create('Îøèáêà äîáàâëåíèÿ äàííûõ'); // Âàðèàíò âòîðîé: // äîáàâëÿåì ñîäåðæèìîå íàøåé êîðíåâîé äèðåêòîðèè â ïàïêó AddFolderDemo // ïðè ïîìîùè âûçîâà ðàñøèðåííîé ôóíêöèè AddFolder, // â êîòîðîé ìîæåì óêàçàòü íàèìåíîâàíèå ïàïêè âíóòðè àðõèâà è óêàçàòü // íåîáõîäèìîñòü äîáàâëåíèÿ ïîäïàïîê (òðåòèé ïàðàìåòð) if Zip.AddFolder('AddFolderDemo', '..\..\', '*.*', False) = 0 then raise Exception.Create('Îøèáêà äîáàâëåíèÿ äàííûõ'); // Âàðèàíò òðåòèé. Èñïîëüçóåì òå-æå ôàéëû èç êîðíåâîé äèðåêòîðèè, // Òîëüêî äîáàâëÿòü áóäåì ðóêàìè ïðè ïîìîùè ìåòîäà AddFile PresentFiles := TStringList.Create; try // Äëÿ íà÷àëà èõ âñå íàéäåì if FindFirst('..\..\*.pas', faAnyFile, SR) = 0 then try repeat if (SR.Name = '.') or (SR.Name = '..') then Continue; if SR.Attr and faDirectory <> 0 then Continue else PresentFiles.Add(SR.Name); until FindNext(SR) <> 0; finally FindClose(SR); end; // Òåïåðü äîáàâèì ïî îäíîìó, // óêàçûâàÿ â êàêîé ïàïêå è ïîä êàêèì èìåíåì èõ ðàçìåùàòü. for I := 0 to PresentFiles.Count - 1 do CheckResult(Zip.AddFile('..\..\' + PresentFiles[I], 'AddFile\' + PresentFiles[I])); // ×åòâåðòûé âàðèàíò - äîáàâëåíèå ñïèñêîì ïðè ïîìîùè ìåòîäà AddFiles. // Êàæäûé ýëåìåíò ñïèñêà äîëæåí áûòü ñôîðìèðîâàí ñëåäóþùèì îáðàçîì: // "Îòíîñèòåëüíûé ïóòü è èìÿ â àðõèâå"="Ïóòü ê ôàéëó" // Ò.å. ValueFromIndex óêàçûâàåò íà ïóòü ê ôàéëó, // à Names - îòíîñèòåëüíûé ïóòü â àðõèâå // Åñëè íå óêàçàòü îòíîñèòåëüíûé ïóòü, òî áóäåò áðàòüñÿ òîëüêî èìÿ ôàéëà. for I := 0 to PresentFiles.Count - 1 do PresentFiles[I] := 'AddFiles\' + PresentFiles[I] + '=' + '..\..\' + PresentFiles[I]; if Zip.AddFiles(PresentFiles) <> PresentFiles.Count then raise Exception.Create('Îøèáêà äîáàâëåíèÿ äàííûõ'); finally PresentFiles.Free; end; // È ïîñëåäíèé âàðèàíò, òî-æå äîáàâëåíèå ñïèñêîì, // òîëüêî â äàííûé ñïèñîê ìîæíî ïîìåùàòü ïàïêè. Ìåòîä AddFilesAndFolders. // Ôàéëû ïîìåùàþòñÿ â ñïèñîê ïî òîìó-æå ïðèíöèïó ÷òî è â ìåòîäå AddFiles. // Çàïèñè äëÿ ïàïîê ôîðìèðóþòñÿ ïî ïðèíöèïó: "Îòíîñèòåëüíûé ïóòü â àðõèâå"="Ïóòü ê ïàïêå" // Ò.å. ValueFromIndex óêàçûâàåò íà ïóòü ê ïàïêå, // à Names - îòíîñèòåëüíûé ïóòü â àðõèâå îò êîðíÿ // Çäåñü äîáàâèì âñå ôàéëû è ïàïêè èç êîðíÿ ïðîåêòà PresentFiles := TStringList.Create; try if FindFirst('..\..\*.*', faAnyFile, SR) = 0 then try repeat if (SR.Name = '.') or (SR.Name = '..') then Continue; PresentFiles.Add('AddFilesAndFolders\' + SR.Name + '=..\..\' + SR.Name); until FindNext(SR) <> 0; finally FindClose(SR); end; Zip.AddFilesAndFolders(PresentFiles, True); finally PresentFiles.Free; end; // Âîò ñîáñòâåííî è âñå - îñòàëîñü ñîçäàòü ñàì àðõèâ... ForceDirectories('..\DemoResults\'); BuildZipResult := Zip.BuildZip('..\DemoResults\CreateZIPDemo1.zip'); // ... è âûâåñòè ðåçóëüòàò Writeln(GetEnumName(TypeInfo(TBuildZipResult), Integer(BuildZipResult))); finally Zip.Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end.