欢迎使用CSDN-markdown编辑器

Win32 Api 遍历文件 笔记

先上图看看成品

这里写图片描述
具备的功能:
1、双击文件夹图标,即可进入文件夹内,遍历;
2、点击“上一层”按钮,即可到上一层文件夹;
3、点击”返回“ 按钮,返回刚刚的地址。
环境: win7系统,vs2013

这里只记录关键性的方法,一些通用的基础知识就不记录了。

用到的控件

1、Edit Control 用来输入和显示当前文件路径;
2、List Control 用来显示路径下的所有文件;
3、Button 用来触发相应操作。
摆放好这些控件,并重新设置每个控件为易记的ID宏。

设置List Control控件

这里写图片描述

遍历操作

1、在生成dialog时,要设置list view。
在WndProc中的消息处理加上

    case WM_INITDIALOG:
    {//对话框初始化消息
        //给listview设置一个图标列表
        HWND hList = GetDlgItem(hWnd, IDC_LIST_FILES);
        //建立ImageList,参数依次是:图标长,宽,32位点阵图,初始时10个,每次增加1个
        g_ImageList =ImageList_Create( GetSystemMetrics(SM_CXSMICON), 
                                  GetSystemMetrics(SM_CYSMICON), ILC_COLOR32, 10, 1);
        //将ImageList与listview绑定起来,并且设置小图标模式
        ListView_SetImageList(hList,g_ImageList,LVSIL_SMALL);
    }

2、先清空ListView控件

    HWND hList = GetDlgItem(hWnd, IDC_LIST_FILES);
    ListView_DeleteAllItems(hList);

3、从Edit Control中获取遍历路径

    HWND hEdit = GetDlgItem(hWnd,IDC_EDIT_PATH);
    GetWindowText(hEdit,szFolder,MAX_PATH);
    std::basic_string<TCHAR> strFind = szFolder;
    strFind += L"\\*.*";//要遍历路径下的所有文件,用通配符

4、开始遍历
遍历用的是 FindFirstFile(),FindNextFile(),FindClose(),这3个函数,基本方法是先用FindFirstFile根据路径找第一个文件,返回的句柄经检测不是无效句柄(INVALID_HANDLE_VALUE -1)后,可持续调用FindNextFile来一个一个找其他文件,直到该函数返回0则该目录下的文件都找了一遍。

    //WIN32_FIND_DATA 是一个结构体,用来存放文件的信息,包含文件名,创建日期,上次访问日期,修改日期,文件大小等等信息。作为遍历函数的传出参数,来存放找到的文件的信息。
    WIN32_FIND_DATA wData;
    //开始遍历第一个文件
    HANDLE hFind = FindFirstFile(strFind.c_str(),&wData);
    if (INVALID_HANDLE_VALUE == hFind) //检测是否为无效句柄
        return;
    int iItem = 0;//表示第一个文件
    while (TRUE)
    {//持续遍历
    //LVITEM 是一个结构体,包含list view控件中显示的项的信息
    //我们设置的是LVSIL_SMALL小图标模式,所以所有的项都是按行来的,虽然是以一种类似表格显示,列为0。当在报表的模式时才有列,会有表头,那种显示模式有文件名,文件修改日期,类型,大小。
        LVITEM li = { 0 };
        //在此我们需要显示文件名,文件图标,状态属性都有效,结构体中对应的项有效
        li.mask = LVIF_TEXT |LVIF_IMAGE|LVIF_STATE ;
        //小图标模式按行来区分,列项恒为0
        li.iItem = iItem;//行
        li.iSubItem = 0;//列
        //将文件名显示在list view上
        li.pszText = wData.cFileName;
        //获取文件的图标,先把获取到的文件的文件名与当前路径组合,再调用SHGetFileInfo来获取图标。
        std::basic_string<TCHAR> strFile = szFolder;
        strFile += L"\\";
        strFile += wData.cFileName;
        //SHFILEINFO 是一个结构体,包含图标句柄,系统图标索引,文件路径,文件类型,用来传出图标信息
        SHFILEINFO sfi;
        SHGetFileInfo(strFile.c_str(),0,&sfi,
            sizeof(SHFILEINFO),SHGFI_ICON|SHGFI_SMALLICON);
        //把文件的ICon添加到Imagelist,并返回新添加的Icon在Imagelist中的索引。ImageList在前面已经与list view绑定在一起。现在在ImageList中加新的文件信息(含图标),然后把该信息在ImageList 中的索引值保存在LVITEM中。至此图标保存在Imagelist中,图标索引,文件名等信息在LVITEM中。LVITEM为ListView中的一个项的信息。接下来把LVITEM插入ListView中即可。
        int iIndex = ImageList_AddIcon(g_ImageList,sfi.hIcon);
        li.iImage = iIndex;//图标在Imagelist中的索引值

        ListView_InsertItem(hList,&li);
        if (!FindNextFile(hFind, &wData))
            break;
        ++iItem;    
    }
    //最后关闭句柄,释放资源
    FindClose(hFind);

还有双击文件夹项,然后进入文件夹内遍历。这个功能下次再添加

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值