获取没有扩展名的文件名?

时间:2011-07-11 06:55:10

标签: c++ visual-c++ filenames filehandle

我是C ++世界的新手,我遇到了一个非常微不足道的问题,即获取没有扩展名的文件名。

我的TCHAR变量包含sample.txt,并且只需要提取sample,我使用PathFindFileName函数只返回我传递的相同值。

我尝试谷歌搜索解决方案,但仍然没有运气?!

编辑:我总是得到三个字母的文件扩展名,我添加了以下代码, 但最后我得到像Montage (2)««þîþ这样的东西我怎么能避免垃圾字符?

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

5 个答案:

答案 0 :(得分:7)

您可以使用PathRemoveExtension功能从文件名中删除扩展程序。

要仅获取文件名( 扩展名),您可能首先使用PathStripPath,然后使用PathRemoveExtension

答案 1 :(得分: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);
}

根据UNICODE设置返回std :: string或std :: wstring。要返回TCHAR *,您需要使用StringType :: c_str();这是一个const指针,所以你不能修改它,并且在生成它的字符串对象被销毁后它无效。

答案 2 :(得分:2)

尝试以下解决方案,

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

试试这个:

假设文件名是字符串。

string fileName = your file.

string newFileName;

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

这将计算原始文件名中的字母,并将它们逐个添加到新文件名字符串中。

有几种方法可以做到这一点,但这是一种基本的方法。