CopyFileEx и 8.3 имена файлов - PullRequest
1 голос
/ 12 марта 2010

Предположим, у вас есть 2 файла в одном каталоге:

Новый файл Name.txt и NewFil ~ 1.txt

Если вы используете CopyFileEx для копирования обоих файлов в одно и то же место, сохраняя одинаковые имена, у вас останется только ОДИН файл (второй заменяет первый), что иногда может быть нехорошо. Любой обходной путь для этого поведения?

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

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

Не существует отличного решения для автоматической генерации псевдонимов коротких имен файлов. Если ваше приложение будет иметь соответствующие привилегии, вы можете использовать SetFileShortName() API . Другой (жесткой) альтернативой может быть полное отключение генерации псевдонимов, хотя я бы не хотел требовать этого от ваших пользователей. Смотри

для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...