【发布时间】:2010-04-23 14:03:03
【问题描述】:
假设你在同一个目录中有 2 个文件:
新文件名.txt 和 新文件~1.txt
如果您使用 CopyFileEx 将两个文件复制到同一个目标,保持相同的名称,您最终将只有一个文件(第二个替换第一个),这有时可能不是一件好事。这种行为的任何解决方法?
【问题讨论】:
标签: winapi
假设你在同一个目录中有 2 个文件:
新文件名.txt 和 新文件~1.txt
如果您使用 CopyFileEx 将两个文件复制到同一个目标,保持相同的名称,您最终将只有一个文件(第二个替换第一个),这有时可能不是一件好事。这种行为的任何解决方法?
【问题讨论】:
标签: winapi
这发生在文件系统级别,因此如果您根本不想禁用 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;
【讨论】:
对于短文件名别名的自动生成,没有一个很好的解决方案。如果您的应用程序有足够的权限,您也许可以使用SetFileShortName() API。另一个(笨手笨脚的)替代方法可能是完全禁用短名称别名生成,尽管我不愿意要求您的用户这样做。见
了解更多详情。
【讨论】: