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;

}


上一篇下一篇

猜你喜欢

热点阅读