我怎样才能使 boost::filesystem::path 不区分大小写

joh*_*co3 5 c++ stl filepath boost-filesystem

谁能告诉我如何使boost::filesystem::path不区分大小写?通常,区分大小写是本机平台决定,但是对于我的应用程序来说这并不是那么简单,因为路径详细信息是从二进制文件中提取的,并且应用程序要求是无论我在什么平台上运行,我都必须处理所有路径都不区分大小写。

迄今为止,我一直这样做的方法是使用boost::filesystem::path::generic_string()方法将我正在比较的路径放入通用字符串格式中以进行字典比较。接下来,我将字符串转换为小写并使用 std::string 函数来执行比较和其他运算符方法。显然,这是次优的,因为我希望能够对路径不是字符串执行字典比较。在内部,boost 的路径运算符 <()实现使用路径迭代器进行巧妙的字典式路径比较 - 这与字符串字典式比较不同。

我认为有某种方法提供特殊的用户定义字符串类型作为构造函数中增强路径的内部表示,但我不确定如何做到这一点。通常,这种性质的大小写不敏感将通过关联的特征类来执行 - 正如您在下面用于 UtlCIString(实用程序不区分大小写的字符串)的不区分大小写的字符串特征字符类中所看到的。如果可以将不同的字符串类型关联为内部字符串类,我将使用以下内容,但我不确定如何:

// case insensitive character traits
// inherited copy (preserves case),
// case insensitive comparison, search
struct traits_nocase : std::char_traits<char>
{
    static bool eq(const char& c1, const char& c2) {
        return toupper(c1) == toupper(c2);
    }
    static bool lt(const char& c1, const char& c2) {
        return toupper(c1) < toupper(c2);
    }
    static int compare(const char* s1, const char* s2, size_t N) {
#if defined (_WIN32)
        return _strnicmp(s1, s2, N);
#else // POSIX
        return strncasecmp( s1, s2, N );
#endif
    }
    static const char* find(const char* s, size_t N, const char& a) {
        for (size_t i = 0; i < N; ++i) {
            if (toupper(s[i]) == toupper(a)) {
                return s + i;
            }
        }
        return 0;
    }
    static bool eq_int_type(const int_type& c1, const int_type& c2) {
        return toupper(c1) == toupper(c2);
    }
};

// string preserves case; comparisons are case insensitive
typedef std::basic_string<char, traits_nocase> UtlCIString;
Run Code Online (Sandbox Code Playgroud)

ine*_*ght 0

简短的回答:boost::filesystem::directory_iterator自己使用和寻找路径。

长答案:不。

您建议如何处理用户在给定路径中合法拥有多个名称相同但大小写不同的文件的情况?

当用户明确告诉您使用其中一个文件,但通过您对用户“想要”的绝对可靠的假设知识决定使用其他路径时,您认为会发生什么?

如果您认为不应该,为什么要使用/定位区分大小写的文件系统?

  • 应用程序的“要求”是文件系统上的文件必须不区分大小写。:) 划掉的话!二进制文件通常包含与本地文件系统上相应路径和文件名不同大小写的路径和扩展名。我无法控制这个问题,就我而言,这是一个我必须解决的二进制文件创作问题。我已经有一个次优的解决方法,但它使用 std::string 的 lex 比较,我想要路径 lex 比较(尽管使用区分大小写的 std::string ,但它已经存在) (3认同)