问题描述:
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
}