Zip-файлы, созданные с помощью Delphi TZipfile на платформе Windows, не переносимые на другие ОС - PullRequest
0 голосов
/ 07 мая 2018

Я написал утилиту 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;
...