假设您在同一目录中有2个文件:
新文件Name.txt和 NewFil〜1.TXT
如果您使用CopyFileEx将两个文件复制到同一目的地,保持相同的名称,您将最终只有一个文件(第二个替换第一个文件),这有时可能不是一件好事。这种行为的解决方法是什么?
答案 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。另一个(重手)替代方案可能是完全禁用短名称别名生成,但我不愿意要求您的用户。见
了解更多详情。