如何快速验证区分大小写的文件名确实存在

时间:2009-03-30 13:00:54

标签: delphi

我必须制作一个兼容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 个答案:

答案 0 :(得分:7)

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的观点,认为它会违反直觉,可能会让用户感到奇怪。

答案 1 :(得分:4)

在Windows上,文件名不区分大小写,因此我看不到您可以从处理文件名中获得什么,就像它们区分大小写一样。

在任何情况下,您都不能拥有两个名为"John.txt""john.txt"的文件,并且在"John.txt"存在时无法找到"john.txt"可能会导致非常困惑的用户。

在这种情况下尝试强制区分大小写是不直观的,我无法看到它的可行用例(如果你有一个我会很高兴听到它是什么)。

答案 2 :(得分:1)

我前一段时间处理过这个问题,即使我确定那里有更简洁的解决方案,我最后还是进行了额外的检查以确定给定的文件名是否相等使用区分大小写的字符串比较器...到找到的文件的名称...

答案 3 :(得分:1)

我使用Java遇到了类似的问题。最后,我最终提取了目录内容列表(为每个文件加载了正确的文件名大小写),然后对每个文件的文件名进行字符串比较。

这是一个丑陋的黑客,但它有效。

编辑:我尝试过做Banang所描述的但至少在Java中,如果你打开文件“a.txt”,你的程序会顽固地将其报告为“a.txt”,即使基础文件系统将其命名为“ A.TXT”。

答案 4 :(得分:0)

您可以使用Delphi的FindFirst和FindNext例程来实现Kris提及的方法。

请参阅this article

相关问题