我需要规范化文件名,使其不包含任何非便携字符。有一个portable_file_name
但它只是检查并返回布尔值。我需要以任何方式将给定的字符串转换为可移植名称以创建文件。
是否有可重复使用的解决方案?
我需要规范化文件名,使其不包含任何非便携字符。有一个portable_file_name
但它只是检查并返回布尔值。我需要以任何方式将给定的字符串转换为可移植名称以创建文件。
是否有可重复使用的解决方案?
./file
或指向符号链接的文件名)转换为在其他可能没有这些概念的平台上有效的文件名。Boost v1.48.0+实际上具有以下功能来完成此操作:path canonical(const path& p, const path& base = current_path());
path canonical(const path& p, system::error_code& ec);
path canonical(const path& p, const path& base, system::error_code& ec);
这通常涉及将相对路径转换为绝对路径。在执行安全检查之前(例如,请求的文件是否在 Web 服务器的 Web 根目录中?),也经常调用这些函数。
请注意,cannonical()
要求文件存在。
我猜你的意思是某些字符(*:;\"?<>/\|)在某些操作系统(例如Mac OS 9)中可作为文件名或路径名字符,但在其他操作系统(如Windows XP)中不可用。是这样吗?
如果是这样,你应该自己进行字符转换。我过去曾使用正则表达式查找和替换不可接受的文件名字符为破折号或其他在所有目标操作系统上都有效的字符。然后,你可以在两个操作系统上安全地使用这些文件。
portable_file_name.normalize();
for (auto &c:name)
{
char test[] = { c,0 };
if (!boost::filesystem::portable_file_name(test))
{
c = '_';
}
}