我需要规范化文件名,使其不包含任何不可移植的字符。但这portable_file_name
只是检查并返回布尔值。无论如何,我需要将给定的字符串转换为可移植的名称来创建文件。
有没有可重复使用的作品?
我需要规范化文件名,使其不包含任何不可移植的字符。但这portable_file_name
只是检查并返回布尔值。无论如何,我需要将给定的字符串转换为可移植的名称来创建文件。
有没有可重复使用的作品?
尝试这个:
boost::filesystem3::path 便携文件名;
便携文件名.normalize();
我假设您的意思是某些字符 (*:;\"?<>/\|) 在某些操作系统(例如 Mac OS 9)上可以用作文件名或路径名字符,但在其他操作系统(例如 Windows XP). 对吗?
如果是这样,您可能应该自己进行字符转换。过去,我通过使用正则表达式来查找不可接受的文件名字符并将其替换为破折号或适用于所有目标操作系统的东西来完成此操作。然后,您可以安全地使用这两个文件。
执行此操作的重要步骤之一是将文件名./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-root 目录中?)。
请注意,cannonical()
需要文件存在。
到目前为止,我能想到的最好的是:
for (auto &c:name)
{
char test[] = { c,0 };
if (!boost::filesystem::portable_file_name(test))
{
c = '_';
}
}