GetLongPathNameW 函数 (fileapi.h)

将指定路径转换为其长格式。

若要以事务处理操作的形式执行此操作,请使用 GetLongPathNameTransacted 函数。

有关文件和路径名称的详细信息,请参阅 命名文件、路径和命名空间

重要

若要使用此函数,调用方必须具有以下对指定路径和父目录的权限:

  • 列出文件夹
  • 读取数据
  • 读取属性

语法

DWORD GetLongPathNameW(
  [in]  LPCWSTR lpszShortPath,
  [out] LPWSTR  lpszLongPath,
  [in]  DWORD   cchBuffer
);

参数

[in] lpszShortPath

要转换的路径。

默认情况下,名称限制为MAX_PATH个字符。 若要将此限制扩展到 32,767 个宽字符,请在路径前面添加“\?\”。 有关详细信息,请参阅命名文件、路径和命名空间

提示

从 Windows 10 版本 1607 开始,可以选择删除MAX_PATH限制,而无需在前面添加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。

[out] lpszLongPath

指向要接收长路径的缓冲区的指针。

可以使用用于 lpszShortPath 参数的同一缓冲区。

[in] cchBuffer

缓冲区 lpszLongPath 的大小指向 ,以 TCHAR 为单位

返回值

如果函数成功,则返回值是复制到 lpszLongPath 的字符串的长度(以 TCHAR 为单位),不包括终止 null 字符。

如果 lpBuffer 缓冲区太小而无法包含路径,则返回值是保留路径所需的缓冲区的大小(以 TCHAR 为单位),以及终止 null 字符。

如果函数因任何其他原因(例如文件不存在)而失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

注解

在许多文件系统上,短文件名包含一个平铺 (~) 个字符。 但是,并非所有文件系统都遵循此约定。 因此,不要假定如果路径不包含平铺 (~) 字符,则可以跳过调用 GetLongPathName

如果文件或目录存在,但找不到长路径, GetLongPathName 将成功,将 lpszShortPath 参数引用的字符串复制到 lpszLongPath 参数引用的缓冲区。

如果返回值大于 cchBuffer 中指定的值,则可以使用足够大的缓冲区再次调用函数,以容纳路径。 有关这种情况的示例,请参阅 GetFullPathName 的示例代码部分。

注意 虽然本例中的返回值是包含终止 null 字符的长度,但成功时返回的值不包括计数中的终止 null 字符。
 
可以访问文件或目录,但无权访问该文件或目录的某些父目录。 因此, 当 GetLongPathName 无法查询路径组件的父目录以确定该组件的长名称时,它可能会失败。 对于文件扩展名超过 3 个字符或总长度超过 12 个字符的目录组件,可以跳过此检查。 有关详细信息,请参阅命名文件、路径和命名空间短名称与长名称部分。

在Windows 8和Windows Server 2012中,以下技术支持此功能。

技术 支持
服务器消息块 (SMB) 3.0 协议
SMB 3.0 透明故障转移 (TFO)
具有横向扩展文件共享的 SMB 3.0 (SO)
群集共享卷文件系统 (CsvFS)
弹性文件系统 (ReFS)
 

示例

有关使用 GetLongPathName 的示例,请参阅 GetFullPathName 的示例代码部分。

注意

fileapi.h 标头将 GetLongPathName 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名的使用与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

   
最低受支持的客户端 Windows XP [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 |UWP 应用]
目标平台 Windows
标头 fileapi.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

文件管理功能

GetFullPathName

GetLongPathNameTransacted

GetShortPathName

命名文件、路径和命名空间