6

Delphi:如何递归超过 255 个字符的路径并读取文件属性

我正在编写一个控制台应用程序,需要遍历路径远大于 255 个字符的目录结构,然后读取其中文件的属性。

从历史上看,我从 2006 年开始使用 Turbo Delphi 使用递归和 FindFirst,但这似乎跳过了超过 255 个字符的路径。

我可以将 FindFirst() 函数换成别的东西吗?还是我必须采取不同的方法?

4

1 回答 1

8

如果您为文件名添加前缀,\\?\则启用扩展长度路径解析,从而摆脱 260 个字符的路径长度限制。

为了使此前缀起作用,您需要调用 Win32 API 函数的 Unicode 版本。因此,如果您使用的是 Unicode Delphi,那么这就是您需要做的所有事情。但是由于您使用的是 Unicode 之前的 Delphi,您将不得不推出您自​​己的版本,FindFirst该版本调用 API 函数的 Unicode 版本。您将调用FindFirstFileW,并使用 Unicode 版本的 struct FindNextFileW, 。FindCloseWIN32_FIND_DATAW

这些问题在 MSDN 上进行了详细讨论:命名文件、路径和命名空间

在您的特定场景中,用于FindFirstFileW调用该问题的文档如下:

在此函数的 ANSI 版本中,名称仅限于 MAX_PATH 字符。要将此限制扩展到 32,767 个宽字符,请调用函数的 Unicode 版本并在路径前添加“\?\”。

请注意,其中的两个文件名字段的WIN32_FIND_DATAW长度限制为 260 个字符。这很好,因为它们只包含名称的相对部分,即相对于包含目录的对象名称。您只需要\\?\在调用时使用前缀FindFirstFileW

为了使用此 API 的 Unicode 版本,您将使用 aWideString作为lpFileName参数FindFirstFileW并使用PWideChar(FileName).

var
  FileName: WideString;
....
// initialise FileName, this will happen in your recursion
FindHandle := FindFirstFileW(PWideChar(FileName), FindData);

至于文件属性,可以WIN32_FIND_DATAW在每次迭代时从结构中读出。你的那部分代码不需要改变。您唯一需要修复的是在对FindFirstFileW. 其他一切都很正常。

于 2013-06-03T18:51:17.247 回答