boost::filesystem规范化文件名

3

我需要规范化文件名,使其不包含任何非便携字符。有一个portable_file_name但它只是检查并返回布尔值。我需要以任何方式将给定的字符串转换为可移植名称以创建文件。

是否有可重复使用的解决方案?

4个回答

0
在进行此操作的重要步骤之一是将文件名(例如./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() 要求文件存在。


0

我猜你的意思是某些字符(*:;\"?<>/\|)在某些操作系统(例如Mac OS 9)中可作为文件名或路径名字符,但在其他操作系统(如Windows XP)中不可用。是这样吗?

如果是这样,你应该自己进行字符转换。我过去曾使用正则表达式查找和替换不可接受的文件名字符为破折号或其他在所有目标操作系统上都有效的字符。然后,你可以在两个操作系统上安全地使用这些文件。


显然,这个小实用函数可以很容易地编写。但我想避免这样做,因为如果相同的可重复使用已经存在并被使用,为什么要重新发明轮子呢? - Neel Basu

0
试试这个:
boost::filesystem3::path portable_file_name;

portable_file_name.normalize();


刚刚检查了一下,这并没有从文件名中删除特殊字符。 - Arsen Zahray

0
到目前为止,我能想到的最好的是:
for (auto &c:name)
    {
        char test[] = { c,0 };
        if (!boost::filesystem::portable_file_name(test))
        {
            c = '_';
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接