如何使boost :: filesystem :: path不区分大小写

时间:2015-01-24 21:56:23

标签: c++ stl filepath boost-filesystem

任何人都可以告诉我如何使 boost :: filesystem :: path 不区分大小写?通常情况下,区分大小写是原生平台决策,但是对于我的应用程序来说这并不是那么简单,因为路径详细信息是从二进制文件中提取的,并且应用程序要求是无论我在哪个平台上继续运行,我必须对所有路径不敏感地处理。

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

我认为有一些方法可以提供一个特殊的用户定义的字符串类型作为内部表示来提升construcor中的路径,但我不知道如何做到这一点。通常,这种性质的不区分大小写将通过相关的traits类来执行 - 正如您在下面的不区分大小写的字符串traits字符类中看到的,用于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;

1 个答案:

答案 0 :(得分:0)

简短回答:使用boost::filesystem::directory_iterator并自行查找路径。

答案很长:不要。

您如何建议处理用户在给定路径中合法拥有多个文件且情况除外的相同名称的情况?

当用户明确告诉您使用一个这些文件时,您认为会发生什么?但是,通过您的绝对绝对正确假设用户知识是什么&#34 ;希望&#34;决定改用其他路径?

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