当前位置:编程学习 > VC++ >>

VC笔记

VC++(MFC)读取共享文件夹下子目录信息,并显示在listctrl控件中
     为了实现文件传输功能,特整理了一下有关读取指定文件下其子目录信息的读取方法,及添加双击事件循环读取下一层信息的功能。
一、变量的定义:
#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()
补充:软件开发 , Vc ,

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,