2011-07-11 53 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