我需要规范化文件名,使其中不包含任何不可移植的字符。有portable_file_name
,但只检查并返回bool。我需要无论如何将给定的字符串转换为可移植的名称来创建文件。
有没有可重复使用的作品?
答案 0 :(得分:0)
我认为您的意思是某些字符(*:; \“?<> / \ |)在某些操作系统(例如Mac OS 9)上可接受为文件名或路径名字符,但在其他人(例如Windows XP)。这是正确的吗?
如果是这样,你应该自己进行角色转换。我过去通过使用正则表达式来查找和替换不可接受的文件名字符,使用破折号或适用于所有目标操作系统的东西。然后,您可以安全地使用这两个文件。
答案 1 :(得分:0)
试试这个:
boost :: filesystem3 :: path portable_file_name;
portable_file_name.normalize();
答案 2 :(得分:0)
到目前为止,我能想到的最好的方法是:
for (auto &c:name)
{
char test[] = { c,0 };
if (!boost::filesystem::portable_file_name(test))
{
c = '_';
}
}
答案 3 :(得分:0)
执行此操作的重要步骤之一是将诸如./file
之类的文件名或指向符号链接的文件名转换为可在不具备这些概念的其他平台上工作的文件名。实际上是has the following functions提高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()
要求文件存在。