Это происходит на уровне файловой системы, поэтому вы ничего не можете сделать, если вообще не хотите отключать генерацию 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;