为了实现文件传输功能,特整理了一下有关读取指定文件下其子目录信息的读取方法,及添加双击事件循环读取下一层信息的功能。
一、变量的定义:
#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);
}
}