MFC读取共享文件夹下子目录信息,并显示在listctrl控件中

时间:2022-10-05 20:10:28

为了实现文件传输功能,特整理了一下有关读取指定文件下其子目录信息的读取方法,及添加双击事件循环读取下一层信息的功能。

一、变量的定义:
#define MAX_COUNT   1024  

#define MAX_PATH       256
struct   OLDPATH
{
   char m_oldpath[MAX_PATH];
};

OLDPATH   oldpath[10];   //记录上一层文件读取的路径
char          m_flpath[MAX_PATH];   //记录当前文件读取的路径

CButton    m_FileBack;//声明返回上一层控件对象
CListCtrl    m_filelist;    //声明listctrl控件对象

int           m_count[MAX_COUNT]; //用来记录共享文件夹下子文件夹在listctrl控件中显示的行号
int          layernum; //用来记录查询的是第几层

二、具体实现:

1、初始化:

for (int i=0;i<MAX_COUNT;i++) //如果listctrl中第i行为文件夹则m_count[i]=i,否则仍为-1
{
   m_count[i]=-1;
}
layernum=0;

//初始化listctrl控件

m_filelist.InsertColumn(0,"名称");
m_filelist.InsertColumn(1,"大小");
CRect   rect;
m_filelist.GetClientRect(&rect);
m_filelist.SetColumnWidth(0,rect.Width()/3);
m_filelist.SetColumnWidth(1,rect.Width()/3);

//获取当前目录的路径

char* des;
des=new char[256];
memset(des,0,256);
GetCurrentDirectory(256,des);
strcat(des,"\\共享文件夹");     //des存储的是你需要读取的文件夹的路径,根据自己的要求进行修改

2、定义查询函数find(char* lpPath)

void CFileScan::find(char *lpPath)

       int i=0;
        m_filelist.DeleteAllItems(); //每次查询前清除上次查询显示在listctrl中的结果

       char szFind[MAX_PATH];
      WIN32_FIND_DATA FindFileData;

      strcpy(szFind,lpPath);
       strcpy(oldpath[layernum].m_oldpath,szFind); 用oldpath记录第几(layernum)层的文件夹的路径

      strcpy(m_flpath,szFind); //用m_flpath记录当前文件夹的路径
      strcat(szFind,"\\*.*");


    HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
    if(INVALID_HANDLE_VALUE == hFind)    return;
    
    while(TRUE)
    {
        if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if(FindFileData.cFileName[0]!='.')//查询出的子文件夹信息
            {
                    CString fileName;

                  fileName=FindFileData.cFileName;
                  m_filelist.InsertItem(i,fileName) ;
                   m_count[i]=i;    //记录是listctrl中的第几行
                    i++;
            }
        }
        else //查询出的子文件信息
        {
              CString fileName,fileSizeh,fileSizelow,str,fileSize;

             DWORD HfileSize,LfileSize;
              HfileSize=FindFileData.nFileSizeHigh; //记录文件大小的高32位
               LfileSize=FindFileData.nFileSizeLow;   //记录文件大小的低32位
             fileSizeh.Format("%d",HfileSize);
              fileSizelow.Format("%d",LfileSize);
             str=fileSizeh;
              str+=fileSizelow;
              fileSize.Format("%db",atoi(str));    //文件大小****b
                // AfxMessageBox(fileSize);

           //将文件名和大小显示在listctrl控件中

            fileName=FindFileData.cFileName;
            m_filelist.InsertItem(i,fileName);
             m_filelist.SetItemText(i,1,fileSize);
               i++;
        }
        if(!FindNextFile(hFind,&FindFileData))    break;
    }
           FindClose(hFind);
            layernum++;   //记录查询的是第几层

}

3、定义listctrl控件下的左键双击消息:

afx_msg void OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult); //消息

ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkList1)

实现:

void CFileScan::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
POSITION pos=m_filelist.GetFirstSelectedItemPosition();
int nItem=m_filelist.GetNextSelectedItem(pos);    //获取双击的行号,从0开始计算

CString listname;
listname=m_filelist.GetItemText(nItem,0);   //得到选中行的文件名

char szFile[MAX_PATH];
strcpy(szFile,m_flpath);

strcat(szFile,"\\");
strcat(szFile,listname);               //得到新的查询路径


if(m_count[nItem]==nItem)           //判断选中行是否为文件夹
{
     for(int i=0;i<MAX_COUNT;i++) //将用来标志子文件夹所在行号信息重新置为-1
             m_count[i]= -1;
     find(szFile);                             //查询当前文件夹的子目录

}
else
{
// CFile file;
  
}

*pResult = 0;
}

4、返回上一层的实现:

void CFileScan::OnFileback() 
{
// TODO: Add your control notification handler code here
        if(layernum>1)   //在进入第二层的查询后才会有返回上一层的操作
       {
                layernum - =2; /*切记是当前层次号减去2,从第二层返回第一层需要的是第0层的路径来进行查询*/

                find(oldpath[layernum].m_oldpath); 
        }
}