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;