Delphi:如何递归超过 255 个字符的路径并读取文件属性
我正在编写一个控制台应用程序,需要遍历路径远大于 255 个字符的目录结构,然后读取其中文件的属性。
从历史上看,我从 2006 年开始使用 Turbo Delphi 使用递归和 FindFirst,但这似乎跳过了超过 255 个字符的路径。
我可以将 FindFirst() 函数换成别的东西吗?还是我必须采取不同的方法?
Delphi:如何递归超过 255 个字符的路径并读取文件属性
我正在编写一个控制台应用程序,需要遍历路径远大于 255 个字符的目录结构,然后读取其中文件的属性。
从历史上看,我从 2006 年开始使用 Turbo Delphi 使用递归和 FindFirst,但这似乎跳过了超过 255 个字符的路径。
我可以将 FindFirst() 函数换成别的东西吗?还是我必须采取不同的方法?
如果您为文件名添加前缀,\\?\
则启用扩展长度路径解析,从而摆脱 260 个字符的路径长度限制。
为了使此前缀起作用,您需要调用 Win32 API 函数的 Unicode 版本。因此,如果您使用的是 Unicode Delphi,那么这就是您需要做的所有事情。但是由于您使用的是 Unicode 之前的 Delphi,您将不得不推出您自己的版本,FindFirst
该版本调用 API 函数的 Unicode 版本。您将调用FindFirstFileW
,并使用 Unicode 版本的 struct FindNextFileW
, 。FindClose
WIN32_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
. 其他一切都很正常。