Boost.Filesystem 中的 MAX_PATH 限制

Posted

技术标签:

【中文标题】Boost.Filesystem 中的 MAX_PATH 限制【英文标题】:MAX_PATH limitation in Boost.Filesystem 【发布时间】:2011-06-04 03:01:52 【问题描述】:

我想使用 Boost.Filesystem 库来操作路径、文件和目录。 我的问题是是否支持超过 MAX_PATH 的路径?

我知道在 Win32API 中我们有解决方法“\\?\”,但 PathAppend 和 PathCombine 等基本函数不支持它。

所以我正在寻找有关 MAX_PATH 和 Boost.FS 的任何有用信息。

谢谢

UPD:我关心路径追加、路径组合等所有操作(我在 Win32API 中有这些函数,但它们不适用于长于 MAX_PATH 的路径) 例如 CreateFileW 和 DeleteFileW 都支持长于 MAX_PATH 的路径。 Boost.FS 可以替代 Win32API 实用程序函数,例如 shlwapi 和 shell32 中的那些通常不支持长路径的函数

【问题讨论】:

【参考方案1】:

事实上,Windows 支持任意长度的路径,并且任何路径都可以在 Windows 上转换为字符串。在这种情况下需要添加\\?\,但这是“从给定路径中生成字符串”操作的一部分。

AFAIK,Boost::FileSystem 在 Windows 上做错了。

我不知道是否计划进行修复。请参阅this 了解如何完成。

【讨论】:

【参考方案2】:

您可以使用或不使用 Boost.Filesystem 操作任意长度的文件系统路径字符串。

MAX_PATH 是 Windows 文件 API 的限制。也就是说,您不能将过长的路径字符串传递给 Windows API。

例如,Boost.Filesystem 的删除功能将因路径长度超过 MAX_PATH 长度而失败。您希望 Boost.Filesystem 执行更改当前目录并使用相对路径来防止 MAX_PATH 限制之类的操作吗?我不认为这是可能的。

已编辑

因为 Boost.Filesystem 是基于 C++ 字符串实现的,所以您无需担心路径长度。 Boost.Filesystem 不仅提供路径字符串操作方法,还提供文件系统操作方法。如果生成的路径太长,您应该避免使用文件系统方法。

我不知道 Boost.Filesystem 是否支持 Win32 Unicode 路径,但您可以在调用 Win32 文件 API 之前将最终的 ANSI 路径转换为 ​​Unicode 路径。

【讨论】:

“MAX_PATH 是 Windows 文件 API 的限制。”—这是不正确的,因为您可以关闭路径解析,从而允许更长的路径(请参阅问题以了解如何做到这一点)。 是的,不是所有的都支持它们,但大多数内核 API 都支持,并且 OP 希望在 Boost.Filesystem 中得到这种支持。

以上是关于Boost.Filesystem 中的 MAX_PATH 限制的主要内容,如果未能解决你的问题,请参考以下文章

错误:'boost::filesystem::path::filename() const() + "/"' 中的'operator+' 不匹配

std::remove 和 boost::filesystem::remove 之间的区别?

C ++ BOOST对`boost :: filesystem :: detail :: copy_file的未定义引用

如何在 Linux 上使用 Boost.Filesystem?

为啥当文件确实存在时`boost::filesystem::exists`返回false?

如何使用 Boost Filesystem 复制目录