簡體   English   中英

如何使boost :: filesystem :: path不區分大小寫

[英]how can I make a boost::filesystem::path case insensitive

任何人都可以啟發我如何使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;

簡短回答:使用boost::filesystem::directory_iterator並自己查找路徑。

答案很長:不要。

您如何建議處理用戶在給定路徑中合法擁有多個文件但具有相同名稱的情況?

當用戶明確告訴您使用其中一個文件時,您認為會發生什么,但是,通過您對用戶“想要”的決定使用其他路徑的絕對絕對可靠的假設知識?

如果您認為不應該使用/定位具有區分大小寫的文件系統,為什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM