c++:打开选择文件夹,记录选择的文件的名称

//头文件是从项目文件拷贝的,看不需要的自己删除(多字节环境下)
#include <Windows.h>
#include <memory>
#include <iostream>
#include <numeric>
#include <list>
#include <cmath>

string   Select_file();


int main()
{
	string openfilename;

	openfilename = Select_file();

	return 0;
}
string   Select_file()
{
#ifdef  _UNICODE
	TCHAR szBuffer[MAX_PATH] = { 0 };
	OPENFILENAME ofn = { 0 };
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = NULL;
	ofn.lpstrFilter = _T("All(*.*)\0*.*\0Text(*.txt)\0*.TXT\0\0");//要选择的文件后缀 
																  //ofn.lpstrInitialDir = _T("D:\\Program Files");//默认的文件路径 
	ofn.lpstrFile = szBuffer;//存放文件的缓冲区 
	ofn.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);
	ofn.nFilterIndex = 0;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;//标志如果是多选要加上OFN_ALLOWMULTISELECT
																	 //BOOL bSel = GetOpenFileName(&ofn);
	if (GetOpenFileName(&ofn))
	{
		//wprintf(L"%s\n", ofn.lpstrFile);  //ofn.lpstrFile  是地址

		/*locale loc("chs");   //输出到控制台
		wcout.imbue(loc);
		wcout << ofn.lpstrFile << endl;
		*/

		char szcConv[200];
		memset(szcConv, 0, 200 * sizeof(char));

		size_t wLen = wcslen(ofn.lpstrFile) + 1;  // 宽字符字符长度,+1表示包含字符串结束符
		int aLen = WideCharToMultiByte(CP_ACP, 0, ofn.lpstrFile, wLen, NULL, 0, NULL, NULL);

		LPSTR lpa = new char[aLen];
		WideCharToMultiByte(CP_ACP, 0, ofn.lpstrFile, wLen, lpa, aLen, NULL, NULL);
		strcpy_s(szcConv, 200, lpa);
		delete[] lpa;
		lpa = NULL;
		//wcout << szcConv << endl;
		//string FileName;
		//FileName = szcConv;
		//return szcConv;

	}

#endif
#ifdef  _MBCS

	char szFileName[MAX_PATH] = { 0 };
	OPENFILENAME openFileName = { 0 };
	openFileName.lStructSize = sizeof(OPENFILENAME);
	openFileName.nMaxFile = MAX_PATH;  //这个必须设置,不设置的话不会出现打开文件对话框
	openFileName.lpstrFilter = "(*.MV)\0*.mv\0(*.DLV)\0*.dlv\0All(*.*)\0*.*\0\0";
	//此处参考
	//https://www.shuzhiduo.com/A/VGzlVpvy5b/
	//https://www.cnblogs.com/lkpp/p/OPENFILENAME-lpstrFilter.html
	openFileName.lpstrFile = szFileName;
	openFileName.nFilterIndex = 1;
	openFileName.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
	string FileName;
	if (::GetOpenFileName(&openFileName))
	{
		//::MessageBoxA(NULL, openFileName.lpstrFile, "", MB_OK);
		//cout << szFileName << endl;

		FileName = szFileName;
		//cout << FileName << endl;
		return FileName;
	}

#endif

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值