2011-07-11 98 views
4

我是新來的C++世界,我堅持一個非常小的問題,即獲得沒有擴展名的文件名。獲取沒有擴展名的文件名?

我有一個包含sample.txtTCHAR變量,需要提取唯一sample,我用PathFindFileName功能,它只是返回又傳給相同的值。

我試着用Google搜索解決方案,但仍然沒有運氣?!

編輯:我總是得到三個字母的文件擴展名,我已經添加了下面的代碼, 但最後我得到了一些像Montage (2)««þîþ我該如何避免在最後的垃圾字符?

TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName) 
{ 
    int fileLength = _tcslen(fileName) - 4; 
    TCHAR* value1 = new TCHAR; 
    _tcsncpy(value1, fileName, fileLength); 
    return value1; 
} 
+1

你只分配一個TCHAR – Ulterior

+0

你應該標記某個答案,或者澄清你的問題以獲得你想要的答案。 –

回答

5

下面就是這樣做的。

#ifdef UNICODE //Test to see if we're using wchar_ts or not. 
    typedef std::wstring StringType; 
#else 
    typedef std::string StringType; 
#endif 

StringType GetBaseFilename(const TCHAR *filename) 
{ 
    StringType fName(filename); 
    size_t pos = fName.rfind(T(".")); 
    if(pos == StringType::npos) //No extension. 
     return fName; 

    if(pos == 0) //. is at the front. Not an extension. 
     return fName; 

    return fName.substr(0, pos); 
} 

這將返回一個std :: string或一個std :: wstring,以適應UNICODE設置。回到TCHAR *,你需要使用StringType :: c_str();這是一個const指針,所以你不能修改它,並且在產生它的字符串對象被銷燬之後它是無效的。

+0

我知道這是一箇舊的答案,但'typedef std :: basic_string StringType;'會更乾淨。 –

+2

在'abc_1.0.0.tar.gz'類似的情況下無法正常工作 – foobar

2

嘗試下面的解決方案,

string fileName = "sample.txt"; 
size_t position = fileName.find("."); 
string extractName = (string::npos == position)? fileName : fileName.substr(0, position); 
+0

什麼,如果文件名是「sample.txt.bak」? – Stephan

+0

'正確'的方法是尋找最後一個。在文件名中,但也存在隱藏的unix文件以點開頭的問題(例如.gitignore,.hgignore) –

+1

我不'TCHAR'有substr方法! –

1

試試這個:

假設文件名是一個字符串。

string fileName = your file. 

string newFileName; 

for (int count = 0; 
    fileName[count] != '.'; 
    count++) 
{ 
    newFileName.push_back(fileName[count]); 
} 

這將統計原始文件名中的字母,並將它們逐個添加到新的文件名字符串中。

有幾種方法可以做到這一點,但這是實現它的一個基本方法。

2
TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName) 
{ 
    int fileLength = _tcslen(fileName) - 4; 
    TCHAR* value1 = new TCHAR[fileLength+1]; 
    _tcsncpy(value1, fileName, fileLength); 
    return value1; 
} 
+0

您認爲擴展名總是3個字符。 .docx,manifest,.html,...? – Stephan

+2

我剛剛糾正了原來的例子,這不是一個實現我想 – Ulterior

6

您可以使用PathRemoveExtension函數從文件名中刪除擴展名。

要獲得唯一的文件名(擴展名),你可能首先使用PathStripPath,其次是PathRemoveExtension

相關問題