CopyFileEx和8.3文件名

时间:2010-03-12 18:35:21

标签: winapi

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

新文件Name.txt和 NewFil〜1.TXT

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

自动生成短文件名别名没有很好的解决方案。如果您的应用程序具有足够的权限,您可以使用SetFileShortName() API。另一个(重手)替代方案可能是完全禁用短名称别名生成,但我不愿意要求您的用户。见

了解更多详情。