2011-10-26 147 views
0

你好我試圖實現一種方式檢查在特定的文本文件中的文件擴展名下面的代碼似乎並沒有做我想要的,但我想知道這是否是正確的方向採取這樣做。如果不是那樣的圖書館,我可以儘可能減少代碼。在Windows這是我如何檢查特定文本文件中的文件擴展名?

string fn = ".txt"; 
if(fn.substr(fn.find_last_of(".") + 1) == ".txt") { 
    fprintf(stderr,"yes"); 
} else { 
    fprintf(stderr,"no"); 
} 

IM 7 32位

+0

你用cout和cin標記了這個,但是然後使用'fprintf'標準錯誤。 FYI有一個標準錯誤的iostream類,所以你可以做'cerr <<「yes」;'和'cerr <<「no」;' – HostileFork

+0

順便說一句,你不檢查文件擴展名「 「但是」/在文件名中「。 –

+1

通過編程訪問文件擴展名通常是濫用文件名。用戶應該能夠把他們想要的任何東西作爲文件名,例如notes.txt.old,這將阻止你的程序工作。告訴操作系統供應商停止以這種方式濫用文件名,並開始以合理的方式存儲文件類型元數據。 – bames53

回答

1

fn.substr(fn.find_last_of(".") + 1)回報"txt"不點。因此,要麼從substr中刪除+1,要麼與沒有點的"txt"比較。

+1

我建議只是「txt」。它更快,你已經比較了這個點。 –

+2

...但要注意,如果文件名不包含任何點,'find_last_of()'將返回'npos',並且npos被定義爲常量-1,則此代碼將向其添加一個並調用'substr( 0)'。因此,正如所寫的那樣,沒有點的字符串的「擴展」將是整個文件名...因爲這個代碼似乎沒有有意表達的原因。 – HostileFork

0

我覺得boost文件系統庫應該可以幫助你(擴展路徑功能)。

http://www.boost.org/doc/libs/release/libs/filesystem/index.html

+0

我無法得到提升libary工作,當我嘗試主要是因爲它的所有來源和我和建設源不上去:(如果有人已經預建binarys爲mingw即時銷售tho – NoobScratcher

+0

你可以按照本指南http:// www .boost.org/doc/libs/1_43_0/more/getting_started/windows.html但它不能保證與mingw一起工作看到開始 – minus

1

我首選的方案是boost::filesystem,零下表明, 但如果沒有:

static std::string const targetExtension(".txt"); 
if (filename.size() >= targetExtension.size() 
     && std::equal(filename.end() - targetExtension.size(), 
         filename.end(), 
         targetExtension.begin())) { 
    std::cerr << "yes"; 
} else { 
    std::cerr << "no"; 
} 

這似乎最簡單的給我。

1

如果你只需要這個在Windows上工作,最好的解決方案是使用Win32 API PathMatchSpec

對於示例:

string fn = ".txt"; 
if(PathMatchSpecA(fn.c_str(), "*.txt") { 
    fprintf(stderr,"yes"); 
} else { 
    fprintf(stderr,"no"); 
} 

或者作爲一個函數:

BOOL HasTxtFileExtension(LPCSTR filename) 
{ 
    return PathMatchSpecA(filename, "*.txt"); 
} 

正如所預料的,這個功能是區分大小寫,並且能夠正確處理這樣的目錄包含點,但該情況文件沒有,例如C:\\directory.with.dots\\testtxt