ifrost писал(а):Подскажите пожалуйста, как запаковать TZipper-ом какую-либо директорию вместе со всем ее содержимым? FindAllFiles из FileUtils возвращает только файлы, а вот пустые подпапки, которых в распакованном odt-файле много, не выдает.
 Я вот для своей программки по диплому написал классы и модули для работы с ODT пока все не доходят руки допилить... но вот могу предложить выдранный код одного из методов общего класса для сохранения директории в зип архив... при этом я не обрабатываю пустые коталоги они просто не нужны Open Office пойемет и так... ну а пробегаю по старинке... Как только допишу выложу побеседуем... сейчас пока реализовано:
1. В классе прородителе для всех  (Write, Calc) 
Открытие из файла
Сохранение в файл
Получение и запись мета данных
для ODT 
добавление текста, шрифта
добавление свойства параграфа
вставка текста в существующий параграф
вставка картинки из файла или из битмама в файл
и что то еще уже не помню... 
ТАк что кому интересно ждите.. Совместными усилиями отшлифуем может будет полезно 

- Код: Выделить всё
- procedure TOODocument.SaveToFile(const FileName: String);
 var Zip:TZipper;
 F:TZipFileEntries;
 Function ReplaceSlash(const OldFileName:string):String;
 var I:Integer;
 begin
 Result:=OldFileName;
 For I:=1 to Length(OldFileName) do
 if Result[I]='\' then  Result[I]:='/';
 end;
 
 Procedure RetZipFiles(var ZipFile:TZipFileEntries; Const BaseDir:String);
 var
 iIndex : Integer;
 SearchRec : TSearchRec;
 sFileName,Dir : String;
 begin
 
 if (BaseDir='') or (not DirectoryExists(BaseDir)) then Exit; //Ааа нас обманули :)
 
 Dir := IncludeTrailingPathDelimiter(BaseDir);      //для Win ='\' Linux='/'
 iIndex := FindFirst(Dir+'*.*', faAnyFile, SearchRec);
 
 while iIndex = 0 do
 begin
 sFileName := Dir+SearchRec.Name;
 
 if SearchRec.Attr = faDirectory then
 begin  //нашли директорию
 if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.')
 and (SearchRec.Name <> '..') then RetZipFiles(ZipFile,sFileName);
 end
 else    //нашли файл, добовляем его к списку для архивации
 ZipFile.AddFileEntry(sFileName,
 ReplaceSlash(ExtractRelativePath(FTempPath,sFileName)));
 
 iIndex := FindNext(SearchRec);
 end;
 FindClose(SearchRec);
 end;
 
 Procedure SaveDoc(var XMLDoc: TXMLDocument;
 const XMLFileName: String);
 begin
 if XMLDoc<>Nil then
 WriteXMLFile(XMLDoc, XMLFileName);
 end;
 begin
 //Сохранение XMLDoc в соответствующие XML файлы
 SaveDoc(FContent,FTempPath+'content.xml'); //content.xml
 SaveDoc(FManifest,IncludeTrailingPathDelimiter(FTempPath+'META-INF')+'manifest.xml');//META-INF/manifest.xml
 SaveDoc(FMeta,FTempPath+'meta.xml');     //meta.xml
 
 F:=TZipFileEntries.Create(TZipFileEntry);
 
 Zip:=TZipper.Create;
 Zip.FileName:=FileName;
 RetZipFiles(F,FTempPath);
 
 Try
 Zip.ZipFiles(F);
 finally
 Zip.Free;
 F.Free;
 end;
 
 end;