【问题标题】:Is there a way to get the search path by the handle when using FindNextFile under Windows?Windows下使用FindNextFile有没有办法通过句柄获取搜索路径?
【发布时间】:2022-12-01 04:40:34
【问题描述】:

我使用 FindFirstFile 和 FindNextFile 列出目录中的文件。当我调用 FindFirstFile 时,我必须为其提供搜索路径。它创建一个可供 FindNextFile 使用的句柄。有没有Win API调用可以通过句柄获取之前给定的路径?

【问题讨论】:

  • 据我所知不是。但是,你一开始就给了它路径,你能不能留着以后用。
  • 它是包含或不包含您提供的通配符的路径和/或文件名的组合,而不仅仅是纯路径。
  • @AmigoJack 是的,但我需要那个。我需要路径/文件名加上我最初提供给 FindFirstFile 函数的通配符。
  • 不,那是不可能的。但由于这听起来像 XY problem,您可以自己定义该函数,因此您的所有代码都调用该函数,然后调用真正的 FindFirstFile(),但还会存储您提供的文件名,以便您稍后可以访问它。
  • @AmigoJack 由于某些原因我仍然需要这个解决方案。我找到了一个名为 GetFinalPathNameByHandleW 的 Win API 调用,它可以通过句柄返回已打开文件的文件名。对于 FindFirstFile/FindNextFile,我需要类似的东西。

标签: windows api delphi


【解决方案1】:

我试着解释这个问题。我想写一个这样的函数:

function FindNextFile(Handle: THandle; var FileInfo: TFileInfo): Boolean;
var
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
  SystemTime: TSystemTime;
  ErrorCode: Cardinal;
begin
  if Winapi.Windows.FindNextFile(Handle, FindData) then
  begin
    Result := True;
    FileInfo.Name := FindData.cFileName;
    FileInfo.ShortName := FindData.cAlternateFileName;
    FileInfo.Size := FindData.nFileSizeLow or Int64(FindData.nFileSizeHigh) shl 32;
    FileTimeToLocalFileTime(FindData.ftCreationTime, LocalFileTime);
    FileTimeToSystemTime(LocalFileTime, SystemTime);
    FileInfo.Creation := SystemTimeToDateTime(SystemTime);
    FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
    FileTimeToSystemTime(LocalFileTime, SystemTime);
    FileInfo.Modification := SystemTimeToDateTime(SystemTime);
    FileTimeToLocalFileTime(FindData.ftLastAccessTime, LocalFileTime);
    FileTimeToSystemTime(LocalFileTime, SystemTime);
    FileInfo.Access := SystemTimeToDateTime(SystemTime);
    FileInfo.Attr := FindData.dwFileAttributes;
  end
  else
  begin
    ErrorCode := GetLastError;
    if ErrorCode = ERROR_NO_MORE_FILES then
      Result := False
    else
      raise EFileListError.CreateResFmt(@SFileListError, [SysErrorMessage(ErrorCode)]);
  end;
end;

发生错误时,我会引发异常。但是我应该向用户显示错误发生的路径,以便在引发异常时需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多