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

时间:2013-06-03 18:45:55

标签: delphi winapi delphi-2006

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

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

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

我可以换掉FindFirst()函数吗?或者我必须采取不同的方法?

1 个答案:

答案 0 :(得分:8)

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

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

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

在您的特定情况下,FindFirstFileW的文档会像这样调用问题:

  

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

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

要使用此API的Unicode版本,您将使用WideString lpFileName参数FindFirstFileW并使用PWideChar(FileName)传递它。

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

对于文件属性,可以在每次迭代时从WIN32_FIND_DATAW结构中读取它们。代码的那部分不需要改变。您需要解决的唯一问题是在初始调用FindFirstFileW时获取> 260 char解析。其他一切都很正常。