2020-12-12--35--U盘小偷的最佳保存路径--添加一
2020-12-12 本文已影响0人
heiqimingren
学习收货总结:
01,有几个api函数,我会使用了。4个api函数
GetSystemDirectory
GetLogicalDriveStrings
GetDriveType
GetDiskFreeSpaceEx
_tcscpy
_tcscmp
_tcslen
基本上都使用了一遍。
image.png image.png
02,自定义生成的函数,如果想传入一个参数,处理之后,将处理结果传出函数作用于之外,原来还可以用指针形式。
image.png
在函数内部,直接把值复制给szDisk
image.png
这操作,真是秀!出乎我的意料。
03,了解了一个数据类型。
/*ULARGE_INTEGER //一个64位的无符号整型值,ULARGE_INTEGER是64位的整数,最大表示范zhi围是18446744073709551616,
long是32位的整数,最大表示范围是4294967296。bai
//类型定义
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart; //低32位
DWORD HighPart;//高32位
};
ULONGLONG QuadPart; //64位的无符号整型
} ULARGE_INTEGER;
*/
image.png
04,
我把备注,写在了代码里
//我自定义的函数,返回空余空间最大的盘符。返回值还是pszDisk。
BOOL CUdiskThieftDlg::GetMaxSpaceDisk(TCHAR *pszDisk, int nDiskBufLen)
{
//获取系统盘符,存到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);
/*
功能:获取主机中所有的逻辑驱动器,以驱动器根路径字符串返回。
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); //参数是指针,
/*
//声明:
GetDriveType(
lpRootPathName: PChar {磁盘根目录}
): UINT;
//返回值:
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位的整数,最大表示范zhi围是18446744073709551616,
long是32位的整数,最大表示范围是4294967296。bai
//类型定义
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart; //低32位
DWORD HighPart;//高32位
};
ULONGLONG QuadPart; //64位的无符号整型
} ULARGE_INTEGER;
*/
// https://blog.csdn.net/weixin_37645543/article/details/79991024,使用方法
GetDiskFreeSpaceEx(pDrive, &lpUse, &lpTotal, &lpFree);//4个参数,//磁盘名称,可用空间,总空间,剩余空间
if (lpFree.QuadPart>nDiskFreeSize )
{
pDstDrive = pDrive;
nDiskFreeSize = lpFree.QuadPart;
}
pDrive += _tcslen(pDrive)+1;//把结尾的null越过去
}
_tcscpy(pszDisk, pDstDrive); //最终结果pDstDrive,复制给pszDisk
return true;
}
05,老师留下的作业
image.png
image.png
06,没有了,第5条,将02和03文件夹都搞定了。
=========================
image.png
image.png image.png
image.png
image.png
image.png
添加一个宏
image.png
image.png
35分钟30秒,老师讲解的问题。
image.png
image.png
上课时候用到的代码:
在头文件当中声明了一个成员函数,主动添加的一个函数
// UdiskThieftDlg.h : 头文件
//
#pragma once
// CUdiskThieftDlg 对话框
class CUdiskThieftDlg : public CDialogEx
{
// 构造
public:
CUdiskThieftDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_UDISKTHIEFT_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
//得到最大空余磁盘空间的盘符
BOOL GetMaxSpaceDisk(TCHAR *pszDisk, int nDiskBufLen);
};
========================================================
// 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 CUdiskThieftDlg::GetMaxSpaceDisk(TCHAR *pszDisk, int nDiskBufLen)
{
//获取系统盘符
TCHAR szWinFolder[MAX_PATH] = { 0 };
GetSystemDirectory(szWinFolder, MAX_PATH); //返回值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);
//用于存储当前最大磁盘分区的变量
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); //参数是指针,
if (nDriveType!=DRIVE_FIXED) //如果不是固定磁盘类型,那就跳过
{
pDrive += _tcslen(pDrive)+1;//把结尾的null越过去
continue;
}
//运行到这里,就说明,是本机自带的磁盘
//获得该磁盘分区的剩余可用空间
ULARGE_INTEGER lpUse = { 0 };
ULARGE_INTEGER lpTotal = { 0 };
ULARGE_INTEGER lpFree = { 0 };
GetDiskFreeSpaceEx(pDrive, &lpUse, &lpTotal, &lpFree);
if (lpFree.QuadPart>nDiskFreeSize )
{
pDstDrive = pDrive;
nDiskFreeSize = lpFree.QuadPart;
}
pDrive += _tcslen(pDrive)+1;//把结尾的null越过去
}
_tcscpy(pszDisk, pDstDrive);
return true;
}