как быстро проверить, что имя файла с учетом регистра действительно существует - PullRequest
3 голосов
/ 30 марта 2009

Мне нужно сделать совместимую с Unix подпрограмму Windows Delphi, которая подтверждает, существует ли имя файла в файловой системе точно в том же CaSe, что и хотел, например, «John.txt» здесь, а не «john.txt».

Если я проверяю «FileExists ('john.txt')», это всегда верно для окон John.txt и JOHN.TXT.

Как создать функцию «FileExistsCaseSensitive (myfile)» для подтверждения того, что файл действительно является тем, чем должен быть.

DELPHI Sysutils.FileExists использует следующую функцию, чтобы узнать, существует ли файл, как изменить его на двойную проверку, если имя файла в файловой системе строчное и существует:

function FileAge(const FileName: string): Integer;
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
    end;
  end;
  Result := -1;
end;

Ответы [ 5 ]

7 голосов
/ 30 марта 2009
function FileExistsEx(const FileName: string): Integer;
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi, LongRec(Result).Lo) then
        if AnsiSameStr(FindData.cFileName, ExtractFileName(FileName)) then Exit;
    end;
  end;
  Result := -1;
end;

Том, я также заинтригован вашим случаем использования. Я склонен согласиться с Motti в том, что это будет нелогичным и может показаться вашим пользователям странным

4 голосов
/ 30 марта 2009

В именах файлов Windows не учитывается регистр, поэтому я не вижу, что вы можете получить от обработки имен файлов, как если бы они были чувствительны к регистру.

В любом случае у вас не может быть двух файлов с именами "John.txt" и "john.txt", и если вы не сможете найти "John.txt", когда существует "john.txt", это может привести к очень озадаченным пользователям.

Попытка обеспечить чувствительность к регистру в этом контексте не интуитивна, и я не вижу жизнеспособного варианта использования для этого (если у вас есть такой, я буду рад услышать, что это такое).

1 голос
/ 30 марта 2009

Я столкнулся с подобной проблемой при использовании Java. В конце концов я закончил тем, что вытащил список содержимого каталога (который загружал правильный регистр имен файлов для каждого файла), а затем выполнил сравнение строк в именах файлов каждого из файлов.

Это ужасный хак, но это сработало.

Изменить: Я пытался делать то, что описывает Banang, но в Java, по крайней мере, если вы откроете файл «a.txt» you'r программа будет упорно сообщать об этом как «a.txt», даже если основные имена файловой системы это " a.txt».

1 голос
/ 30 марта 2009

Я имел дело с этой проблемой некоторое время назад, и даже если я уверен , что есть более точные решения, я просто закончил делать дополнительную проверку, чтобы увидеть, было ли данное имя файла имя найденного файла, используя регистр символов с учетом регистра ...

0 голосов
/ 30 марта 2009

Вы можете реализовать упомянутый Крисом подход, используя процедуры Delphi FindFirst и FindNext.

См. эту статью

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