【问题标题】:CopyFileEx and 8.3 file namesCopyFileEx 和 8.3 文件名
【发布时间】:2010-04-23 14:03:03
【问题描述】:

假设你在同一个目录中有 2 个文件:

新文件名.txt 和 新文件~1.txt

如果您使用 CopyFileEx 将两个文件复制到同一个目标,保持相同的名称,您最终将只有一个文件(第二个替换第一个),这有时可能不是一件好事。这种行为的任何解决方法?

【问题讨论】:

    标签: winapi


    【解决方案1】:

    这发生在文件系统级别,因此如果您根本不想禁用 SFN 生成,则无能为力。

    我用来处理这个问题的方法是:

    1) 在复制文件之前,我检查文件名是否存在。 2)如果发生冲突,那么我首先将现有文件重命名为一些临时名称 3)然后我复制文件 4) 重命名第一个文件。

    要检测碰撞,请执行以下操作:

    function IsCollition(const Source, Destination: string; var ExistingName: string): boolean;
    var
      DesFD: TSearchRec;
      Found: boolean;
      ShortSource, FoundName: string;
    begin
      ShortSource:= ExtractFileName(SourceName);
      Found:= false;
      FoundName:= WS_NIL;
    
      if (FindFirst(DestinationName, faAnyFile, DesFD) = 0) then
      begin
        Found:= true;
        FoundName:= DesFD.Name;
        SysUtils.FindClose(DesFD);
      end;
    
      if (not Found) or (SameFileName(ShortSource, FoundName)) then
      begin
        Result:= false;
      end else
      begin
        // There iis a collision:
        // A  file exists AND it's long name is not equal to the original name
        Result:= true;
      end;
    
      ExistingName:= FoundName;
    end;
    

    【讨论】:

      【解决方案2】:

      对于短文件名别名的自动生成,没有一个很好的解决方案。如果您的应用程序有足够的权限,您也许可以使用SetFileShortName() API。另一个(笨手笨脚的)替代方法可能是完全禁用短名称别名生成,尽管我不愿意要求您的用户这样做。见

      了解更多详情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        相关资源
        最近更新 更多