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);
还有双击文件夹项,然后进入文件夹内遍历。这个功能下次再添加