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

标签 delphi winapi delphi-2006

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

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

过去,我从 2006 年开始就使用 Turbo Delphi 使用递归和 FindFirst,但这似乎会跳过大于 255 个字符的路径。

我可以将 FindFirst() 函数替换为其他函数吗?还是我必须采取不同的方法?

最佳答案

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

为了使此前缀起作用,您需要调用 Win32 API 函数的 Unicode 版本。因此,如果您使用的是 Unicode Delphi,那么这就是您需要做的。但由于您使用的是 Unicode 之前的 Delphi,您必须推出自己的 FindFirst 版本来调用 API 函数的 Unicode 版本。您将调用 FindFirstFileWFindNextFileWFindClose 并使用 Unicode 版本的结构体 WIN32_FIND_DATAW

MSDN 上详细讨论了这些问题:Naming Files, Paths, and Namespaces .

在您的特定场景中,FindFirstFileW 的文档像这样指出问题:

In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\?\" to the path.

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

为了使用此 API 的 Unicode 版本,您将使用 WideString 作为 FindFirstFileWlpFileName 参数,并使用PWideChar(文件名)

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

至于文件属性,可以在每次迭代时从 WIN32_FIND_DATAW 结构体中读取它们。您的那部分代码不需要更改。您需要修复的唯一问题是在首次调用 FindFirstFileW 时获取 >260 个字符解析。其他一切都正常进行。

关于delphi - 如何递归超过 255 个字符的路径并读取文件属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903664/

相关文章:

delphi - 在代码中设置 ADT 字段

c++ - window编程中如何与dropbox联动

http - 什么大小的缓冲区最适合将文件上传到互联网

windows - FindWindow 收到的句柄是否需要释放?

function - Delphi 中可以对回调函数进行类型转换吗?

delphi - DBGrid组件如何确定要显示的初始列宽?

delphi - 如何在Delphi中为伪浏览器启用cookie?

windows - 我应该在哪里存储配置文件?

c# - Delphi 相当于 C# 的 DataGridView

delphi - 如果我的所有路径都正确,为什么 Delphi 会显示 "Unit xxx compiled with a different version of yyy"?