////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * 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.