2020-11-21--11--文件的查找与遍历---经典,值得

2020-12-02  本文已影响0人  heiqimingren

学习总结:
01,学习到不少东西。
-tmain()-------是控制台程序入口函数
--WINAPI _tWinMain---------是windows窗口程序入口函数
关键是,2个函数可以同时存在,只是由于vc项目环境设置不同,会自动调用不同的函数入口。

02,FindNextFile和FindFirstFile,这2个api函数的用法,有了比较深入的了解

03,sprintf---sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,...]);


image.png image.png

04,strcmp 与_tcscmp的区别
strcmp 用来比较ANSI字符串,而_tcscmp用 来比较UNICODE(宽字符)的字符串。ANSI字符串中,1个英文字母为1个字节,1个中文字符为2个字节,遇到0字符表示字符串结束。而在 UNICODE(宽字符)中,所有的字符都为2个字节,此时字符串中间的字节,可能含有0字符,此时就不能用strcmp比较了。
Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字 的情况。而后者是双字节方式,方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程 序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以以 UNICODE方式保存。


image.png

05,cout和wcout
总结几点:

1、cout是用来输出char的,如果用cout输出wchar,只会输出地址,要使用wcout输出wchar。

2、wcout默认是不输出中文的,要想输出中文,要先加入setlocale( LC_ALL, "chs" );这行代码。

06,c++里&是什么意思?
&:在C++中有两种意思,一bai种du是取地址符,是单目运算zhi符;另一种是位运算符,表dao示“按zhuan位与”,是双shu目运算符。

a&b表示a和b执行按位与运算。
按位与运算符(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0

07,# 关于WIN32_FIND_DATA中的dwFileAttributes

这局代码的理解:if ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0)

image.png

================


image.png
image.png
image.png
image.png

接下来,就是实战阶段。


image.png image.png

截图图片:


image.png
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <tchar.h>
#include <URLmon.h>
using namespace std;
#pragma comment(lib,"Urlmon.lib")


//枚举文件,2个参数,文件夹路径和要查找的文件类型。
BOOL EnumFiles(LPCTSTR lpszPath, LPCTSTR lpszType)
{
    TCHAR szPath[MAX_PATH] = {0};
    _stprintf(szPath, _T("%s\\%s"), lpszPath, lpszType); //字符串格式化,将文件夹路径和文件类型合并成一个。

    WIN32_FIND_DATA FindData = { 0 };

    HANDLE hFile= FindFirstFile(szPath, &FindData);
    if (hFile == INVALID_HANDLE_VALUE) return FALSE;

    BOOL bRet = FALSE;
    do 
    {
        bRet = FindNextFile(hFile, &FindData);
        if (!bRet)  //如果找不到下一个文件,跳出循环
        {
            break;
        }

        wcout << FindData.cFileName << endl;          //cfilename是 char字符集。但是属性用的unicode字符集,所以需要用wcout
    } while (bRet);

    return true;
}
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)   //当项目属性--链接器--系统--窗口,会调用此入口。
{
    EnumFiles(_T("C:\\Windows"), _T("*.*"));


    return 0;
}

int _tmain(int argc, TCHAR *argv[])       //当项目属性--链接器--系统--控制台,会调用此入口。
{
    EnumFiles(_T("C:\\Windows"), _T("*.*"));
    return 0;
}

拓展难度:


image.png
image.png

最终完整版代码:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <tchar.h>
#include <URLmon.h>
using namespace std;
#pragma comment(lib,"Urlmon.lib")
//枚举文件,2个参数,文件夹路径和要查找的文件类型。
BOOL EnumFiles(LPCTSTR lpszPath, LPCTSTR lpszType)
{
    TCHAR szPath[MAX_PATH] = {0};
    _stprintf(szPath, _T("%s\\%s"), lpszPath, lpszType); //字符串格式化,将文件夹路径和文件类型合并成一个。

    WIN32_FIND_DATA FindData = { 0 };

    HANDLE hFile= FindFirstFile(szPath, &FindData);
    if (hFile == INVALID_HANDLE_VALUE) return FALSE;

    BOOL bRet = FALSE;
    do 
    {
        bRet = FindNextFile(hFile, &FindData);
        if (!bRet)  //如果找不到下一个文件,跳出循环
        {
            break;
        }

        //判断一个文件夹是一个文件
        if ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0)
        {
            if (_tcscmp(FindData.cFileName,_T(".")||_tcscmp(FindData.cFileName,_T("..") ) )   //如果文件夹名字,是.或者..,就跳过展示
            {
                continue;
            }

            //这是一个文件夹
            cout << "文件夹:";

        }
        else
        {
            //这是一个文件
            cout << "文件:";

        }

        wcout << FindData.cFileName << endl;          //cfilename是 char字符集。但是属性用的unicode字符集,所以需要用wcout
    } while (bRet);

    return true;
}

int _tmain(int argc, TCHAR *argv[])       //当项目属性--链接器--系统--控制台,会调用此入口。
{
    EnumFiles(_T("C:\\Windows"), _T("*.*"));
    return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读