在windows平台上使用Delphi TZipfile创建的Zip文件不可移植到其他操作系统

在windows平台上使用Delphi TZipfile创建的Zip文件不可移植到其他操作系统,delphi,zip,compatibility,Delphi,Zip,Compatibility,我使用Delphi编写了一个Zip实用程序,它可以压缩目录树,但只包含某些类型的文件。目标是创建一个实用程序,该实用程序将创建一个zip文件包,用于远程处理发送的文件 在我的第一次尝试中,我能够在windows平台上创建一个zip文件并提取完整的目录树,但它们在发送到远程系统时没有被处理。我发现在IOS上查看或提取zip文件时,目录结构似乎松动了,我怀疑这就是问题所在 在对堆栈溢出和web进行了一些研究之后,我在目录路径中将反斜杠替换为正斜杠。这没什么区别。目录结构和文件在windows上提取得

我使用Delphi编写了一个Zip实用程序,它可以压缩目录树,但只包含某些类型的文件。目标是创建一个实用程序,该实用程序将创建一个zip文件包,用于远程处理发送的文件

在我的第一次尝试中,我能够在windows平台上创建一个zip文件并提取完整的目录树,但它们在发送到远程系统时没有被处理。我发现在IOS上查看或提取zip文件时,目录结构似乎松动了,我怀疑这就是问题所在

在对堆栈溢出和web进行了一些研究之后,我在目录路径中将反斜杠替换为正斜杠。这没什么区别。目录结构和文件在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;
procedure TFORM2.FileSearch(Zip:TZipFile;const路径名:string;RootPos:Integer);
常数
文件掩码='*.';
扩展名='.csv、.xml、.txt、.jpg';//要压缩的文件类型
变量
Rec:TSearchRec;
路径:字符串;
FromPath,ToPath:String;
开始
路径:=修剪(包括轨道反斜杠(路径名));
如果FindFirst(Path+FileMask,faAnyFile-faDirectory,Rec)=0,则
尝试
重复
如果AnsiPos(ExtractFileExt(Rec.Name),Extensions)>0,则
开始
FromPath:=路径+记录名称;
ToPath:=复制(Path,RootPos,Path.Length-RootPos+1)+Rec.Name;;
ToPath:=StringReplace(ToPath,'\','/',[rfReplaceAll]);
Zip.Add(FromPath,ToPath);
文件计数:=文件计数+1
结束;
直到FindNext(Rec)0;
除了
关于E:EZipException do
开始
ShowMessage('异常:'+E.Message);
结束;
结束;
FindClose(Rec);
如果FindFirst(路径+'*.*',faDirectory,Rec)=0,则
尝试
重复
如果((Rec.Attr和faDirectory)0)和(Rec.Name'.'),并且
(记录名称“..”)然后
文件搜索(Zip、路径+记录名、RootPos);
直到FindNext(Rec)0;
除了
关于E:EZipException do
开始
ShowMessage('异常:'+E.Message);
结束;
结束;
FindClose(Rec);
结束;

这里的代码比需要的多。简化您应该能够构造一个不包含任何文件查找代码、任何扩展名匹配代码的最小示例。只需要压缩一个硬编码的路径,也许只有一个文件。提供这一点,希望它会变得清晰。您可能也很清楚。您不应该使用IncludeTrailingBackslax,因为它不是跨平台的。使用IncludeTrailingPathDelimiter。您尚未指出实际发生的情况,例如,FromPath和ToPath的示例值。正如David所指出的,这个例子并不完整。例如,没有代码显示传递给TZipFile的Open方法的文件名是什么,以及是否调用了Close方法。事实上,zip目录应始终使用正斜杠作为路径分隔符,请参见4.4.17.1