c++学习 | MFC —— u盘小偷的最佳保存路径

问题描述:

1.自动获取除系统盘外的剩余空间最大的盘符;
2.在打开软件时,在保存路径编辑框中默认显示推荐路径。例如:D:\文件名


实现代码:

1.自动获取除系统盘外的剩余空间最大的盘符;
(1).h文件中

public:
    //自定义函数:得到最大空余磁盘空间的盘符。
    BOOL GetMaxSpaceDisk(TCHAR *pszDisk, int nDiskBufLen);

(2).cpp文件中

// CUdiskThieftDlg 消息处理程序
// CUdiskThieftDlg 消息处理程序

BOOL CUdiskThieftDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO:  在此添加额外的初始化代码
    
    
    TCHAR szDisk[16] = { 0 };
    GetMaxSpaceDisk(szDisk,16);
    

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

//自定义的函数,返回空余空间最大的盘符。返回值是盘符名 pszDisk。
BOOL CUDiskThiefDlg::GetMaxSpaceDisk(TCHAR* pszDisk, int nDickBufferLength)
{
	//获取系统盘符,存到szWinFolder 当中。
	TCHAR szWinFolder[MAX_PATH] = { 0 };
	GetSystemDirectory(szWinFolder, MAX_PATH);   //返回值szWinFolder = C:\windows\system32 。这里我只想保存c:\


	 //由于szWinFolder,往往有文件夹名称,例如C:\windows\system32,这里只想留下c:\  后面的取消。
	int nFlag = -1;
	for (UINT idx = 0; idx < _tcslen(szWinFolder); ++idx)
	{
		if (szWinFolder[idx] != '\\')  //循环遍历每个字符,当字符等于\的时候,就记录字符\在字符数组中的序号。
		{
			continue;
		}
		nFlag = idx;
		break;
	}
	if (nFlag >= 0)
	{
		szWinFolder[nFlag + 1] = '\0'; //组合成 c:\  
	}


	TCHAR szDrives[MAX_PATH] = { 0 };
	GetLogicalDriveStrings(MAX_PATH , szDrives); //全部磁盘名称返回到szDrives
	/*
    GetLogicalDriveStrings 功能:获取主机中所有的逻辑驱动器,以驱动器根路径字符串返回。
    DWORD GetLogicalDriveStrings(DWORD nBufferLength,LPTSTR lpBuffer);
    参数:
    nBufferLength: 指向的内存空间的大小,以字节为单位。
    lpBuffer: 指向存储返回结果字符串的内存空间

    返回值:
    函数的返回值指明了函数调用是否成功,如果成功则返回缓冲区中返回结果的总长度;如果返回值大于nBufferLength,说明给定的缓冲区大小不够,返回值是实际需要的大小;如果返回0,则说明函数运行出错。
    说明:
    函数调用成功后,将在缓冲区中依次填入本机所具有的驱动器根路径字符串,假如系统中有4个逻辑驱动器“C:\”、“D:\”、“E:\”,“F:\”。执行后在缓冲区中的结果如下:
    0x43 0x3a 0x5c 0x00 0x44 0x3a 0x5c 0x000x45 0x3a 0x5c 0x00 0x46 0x3a 0x5c 0x00 0x00
    即连续存放了“C:\”、“D:\”、“E:\”,“F:\”这4个字符串。

    注意:会在每个字符串后加一个‘\0’结束符,在所有卷标字符串的最后在加一个结束符)。
    
    */


	//用于存储当前最大磁盘分区的变量
	TCHAR* pDstDrive = NULL;
	ULONGLONG nDiskFreeSize = 0;

	TCHAR* pDrive = szDrives;

	while (*pDrive)
	{
		//判断一下,如果与系统盘相同,就跳过,不选择系统盘作为返回结果
		if (_tcscmp(pDrive, szWinFolder) == 0)
		{
			pDrive += _tcslen(pDrive) + 1;//把结尾的null越过去
			continue;
		}

		//判断系统盘外的最大盘符

		UINT  nDriveType = GetDriveType(pDrive); //参数是指针
		/*
        声明: 
        UINT GetDriveType(lpRootPathName: PChar {磁盘根目录});

        //返回值:
        DRIVE_UNKNOWN     = 0; {未知}
        DRIVE_NO_ROOT_DIR = 1; {可移动磁盘}
        DRIVE_REMOVABLE   = 2; {软盘}
        DRIVE_FIXED       = 3; {本地硬盘}
        DRIVE_REMOTE      = 4; {网络磁盘}
        DRIVE_CDROM       = 5; {CD-ROM}
        DRIVE_RAMDISK     = 6; {RAM 磁盘}
        */


		if (nDriveType != DRIVE_FIXED) // 如果不是固定磁盘类型,那就跳过
		{
			pDrive += _tcslen(pDrive) + 1;//把结尾的null越过去
			continue;
		}
		//是本机自带的磁盘分区
		//获得该磁盘的剩余可用空间

		ULARGE_INTEGER lpUse = { 0 };	//已用
		ULARGE_INTEGER lpTotal = { 0 };	//全部
		ULARGE_INTEGER lpFree = { 0 }; //剩余
		/*ULARGE_INTEGER 一个64位的无符号整型值,ULARGE_INTEGER是64位的整数,最大表示范围是18446744073709551616,long是32位的整数,最大表示范围是4294967296。*/


		GetDiskFreeSpaceEx(pDrive, &lpUse, &lpTotal, &lpFree);//4个参数,//磁盘名称,可用空间,总空间,剩余空间


		if (lpFree.QuadPart > nDiskFreeSize)
		{
			pDstDrive = pDrive;
			nDiskFreeSize = lpFree.QuadPart;

		}
		pDrive += _tcslen(pDrive) + 1;//把结尾的null越过去

	
	}
	_tcscpy_s(pszDisk, nDickBufferLength, pDstDrive);   //最终结果pDstDrive,复制给pszDisk
	return 0;
}

2.在打开软件时,在保存路径编辑框中默认显示推荐路径。例如:D:\文件名

//初始化对话框
BOOL CUDiskThiefDlg::OnInitDialog()
{
	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	TCHAR szDisk[16] = { 0 };
	GetMaxSpaceDisk(szDisk , 16);
	
	//实现功能:打开软件后,立马在保存路径中显示默认路径。D:\UDiskThief
	TCHAR szDstDisk[MAX_PATH] = { 0 };
	sprintf_s(szDstDisk, MAX_PATH, _T("%s%s\\"), szDisk, _T("UDiskThief"));
	SetDlgItemText(【编辑框的ID】IDC_EDIT_SAVE_PATH, szDstDisk);



	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ MFC中的文件打开和保存对话框可以通过CFileDialog类来实现。CFileDialog类是MFC提供的一个对话框类,用于选择文件的打开和保存操作。 要使用CFileDialog类,首先需要包含头文件<afxdlgs.h>。然后可以创建一个CFileDialog对象,并使用DoModal()函数来显示对话框。 下面是一个简单的示例代码,演示如何使用CFileDialog类来实现文件的打开和保存对话框: ```cpp #include <afxdlgs.h> // 文件打开对话框示例 void OpenFile() { CFileDialog dlg(TRUE); // 创建一个打开文件对话框 if (dlg.DoModal() == IDOK) // 显示对话框并检查用户是否点击了“打开”按钮 { CString filePath = dlg.GetPathName(); // 获取用户选择的文件路径 // 在这里可以对文件进行处理,比如读取文件内容等 } } // 文件保存对话框示例 void SaveFile() { CFileDialog dlg(FALSE); // 创建一个保存文件对话框 if (dlg.DoModal() == IDOK) // 显示对话框并检查用户是否点击了“保存”按钮 { CString filePath = dlg.GetPathName(); // 获取用户选择的文件路径 // 在这里可以将数据保存到文件中 } } ``` 在上面的示例代码中,OpenFile()函数演示了如何使用CFileDialog类来实现文件的打开对话框。首先创建一个CFileDialog对象,参数TRUE表示打开文件对话框。然后调用DoModal()函数显示对话框,并检查用户是否点击了“打开”按钮。如果用户点击了“打开”按钮,可以通过GetPathName()函数获取用户选择的文件路径。 SaveFile()函数演示了如何使用CFileDialog类来实现文件的保存对话框。与打开对话框类似,首先创建一个CFileDialog对象,参数FALSE表示保存文件对话框。然后调用DoModal()函数显示对话框,并检查用户是否点击了“保存”按钮。如果用户点击了“保存”按钮,可以通过GetPathName()函数获取用户选择的文件路径。 需要注意的是,CFileDialog类还提供了其他一些函数来设置对话框的标题、过滤器、默认文件名等属性,可以根据实际需求进行设置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值