美文网首页
2020-12-12--35--U盘小偷的最佳保存路径--添加一

2020-12-12--35--U盘小偷的最佳保存路径--添加一

作者: heiqimingren | 来源:发表于2020-12-12 22:42 被阅读0次

    学习收货总结:
    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;
    
    }
    
    
    

    相关文章

      网友评论

          本文标题:2020-12-12--35--U盘小偷的最佳保存路径--添加一

          本文链接:https://www.haomeiwen.com/subject/colygktx.html