C++ 通过文件路径获取文件名

从文件路径中,获取文件名称。比如:"C:\\Users\\Kandy\\Desktop\\data.txt" ---> data.txt。

在C++的范畴,可以通过 strrchr 或者 string 中的查找字符的 find_last_of 来处理。而在Windows环境中,用其他的API来处理,或许会方便很多!

#include <string>
#include <tchar.h>
#include <Shlwapi.h>
#pragma comment( lib, "shlwapi.lib" )


void split_path(const TCHAR* szFullPath, TCHAR* szDrive, TCHAR* szDir, TCHAR* szFileName, TCHAR* szExt)   
{
#if (_MSC_VER <= 1200) // VC6.0
	_tsplitpath(szFullPath, szDrive, szDir, szFileName, szExt);	
#else
	_tsplitpath_s(szFullPath,
		szDrive,
		szDrive ? _MAX_DRIVE : 0,
		szDir,
		szDir ? _MAX_DIR : 0,
		szFileName,
		szFileName ? _MAX_FNAME : 0,
		szExt,
		szExt ? _MAX_EXT : 0);
#endif
}

//
int _tmain(int argc, _TCHAR* argv[])
{
	//
	std::wstring wszPath = ::PathFindFileName(L"c://Program Files//File.txt");
	printf("wszPath : %ls\n\n", wszPath.c_str());

	///_tsplitpath
	TCHAR szPath[MAX_PATH] = {0};
	TCHAR szDrive[MAX_PATH] = {0};
	TCHAR szDir[MAX_PATH] = {0};
	TCHAR szFileName[MAX_PATH] = {0};
	TCHAR szExt[MAX_PATH] = {0};

	std::wstring szDesktop = L"C:\\Users\\Kandy\\Desktop\\data.txt";
	wcscpy(szPath, szDesktop.c_str());

	split_path(szPath, szDrive, szDir, szFileName, szExt);

	printf("szPath : %ls\nszDrive : %ls\nszDir : %ls\nszFileName : %ls\nszExt : %ls\n\n", 
		szPath, szDrive, szDir, szFileName, szExt);


	//strrchr
	std::string path = "D:/3rdparty/data/test.txt";
	//path = "D:\\3rdparty\\data\\test.txt";
	const char *pbuf = strrchr(path.c_str(),'/');//结果:"/test.txt"
	if (pbuf)
	{
		printf("sz_result : %s\n\n", pbuf+1);
	}
	
	//find_last_of
	int pos = path.find_last_of('\\');
	std::string sz_path;
	if (pos != -1)
	{
		sz_path = std::string(path.substr(pos+1));
	}
	else
	{
		pos = path.find_last_of('/');
		sz_path = std::string(path.substr(pos+1));
	}
	printf("sz_path : %s\n", sz_path.c_str());

	system("pause");

	return 0;
}
运行结果:

wszPath : File.txt

szPath : C:\Users\Kandy\Desktop\data.txt
szDrive : C:
szDir : \Users\Kandy\Desktop\
szFileName : data
szExt : .txt

sz_result : test.txt

sz_path : test.txt

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值