Я написал утилиту Zip, использующую Delphi, которая архивирует дерево каталогов, но включает в себя только файлы определенных типов. Цель состоит в том, чтобы создать утилиту, которая создаст пакет файлов zip для отправки на удаленную обработку.
С первой попытки мне удалось создать zip-файл и извлечь полное дерево каталогов на платформе Windows, но они не обрабатывались при отправке в удаленную систему. Я обнаружил, что при просмотре или извлечении в IOS zip-файл, похоже, теряет структуру каталогов, и я подозреваю, что это проблема.
После некоторых исследований переполнения стека и Интернета я заменил обратную косую черту прямой косой чертой в пути к каталогу. Это не имеет значения. Структура каталогов и файл по-прежнему отлично извлекаются в Windows, но не в IOS, и при этом они не извлекаются на платформе Amazon, где эти файлы в конечном итоге будут обрабатываться автоматически.
Код, который я использую для добавления файлов с соответствующим расширением, приведен ниже. Что мне здесь не хватает - в чем секрет создания полностью переносимых zip-файлов?
procedure TFORM2.FileSearch(Zip: TZipFile; const PathName: string; RootPos: Integer);
const
FileMask = '*.*';
Extensions = '.csv,.xml,.txt,.jpg'; // File types we want to zip
var
Rec: TSearchRec;
Path: string;
FromPath, ToPath: String;
begin
Path := Trim(IncludeTrailingBackslash(PathName));
if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
if AnsiPos(ExtractFileExt(Rec.Name), Extensions) > 0 then
Begin
FromPath := Path + Rec.Name ;
ToPath := copy(Path, RootPos, path.Length - rootpos + 1) + Rec.Name;;
ToPath := StringReplace(ToPath,'\','/',[rfReplaceAll]);
Zip.Add(FromPath, ToPath);
File_Count := File_Count + 1
End;
until FindNext(Rec) <> 0;
Except
on E:EZipException do
Begin
ShowMessage('Exception: ' + E.Message);
End;
End;
FindClose(Rec);
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name <> '.') and
(Rec.Name <> '..') then
FileSearch(Zip, Path + Rec.Name, RootPos);
until FindNext(Rec) <> 0;
Except
on E:EZipException do
Begin
ShowMessage('Exception: ' + E.Message);
End;
end;
FindClose(Rec);
End;