MFC统计一个目录下子文件夹的个数以及每个子文件夹中文件的数目

这里用了全局变量,因为需要在两个函数中进行操作

vector<CString>subDirectory;//用于存储子文件夹的名字
vector<int>subFileNum;//用于存储子文件夹中的文件数目
void CFileSeparationDlg::OnBnClickedStatistic()
{
	// TODO: 在此添加控件通知处理程序代码
	CString m_path;
	CString m_subPath;
	//CStdioFile file;
	CFile file;
	CString subfileNum2;
	vector<CString>vector;
		int i = 0, j = 0;//j记录子文件夹的个数,i无用
		int p = 0, q = 0;//p记录子文件夹中文件的个数,q无用
	GetDlgItemText(IDC_EDIT2, m_path);
	getNum(m_path, i, j);//第一个参数为目录路径	
	CString s;
	//s.Format(_T("子文件夹个数:%d"),j);//输出格式化
	for (int k = 0; k < j; k++)
	{
		m_subPath = m_path + '/'+subDirectory.at(k);//进入到子文件夹中
		getNum(m_subPath, p, q);
		subFileNum.push_back(p);		
		p = 0;q = 0;//计数完一个子文件夹中的文件数目,p,q归零,继续计数下一个子文件夹文件个数
	}
	file.Open(m_path + '/' + _T("PictureNum.txt"), CFile::modeCreate | CFile::modeReadWrite);
	for (int w = 0; w < subDirectory.size(); w++)
	{				
		subfileNum2.Format(_T("%d"), subFileNum.at(w));		
		WORD unicode = 0xFEFF;  //这句重要,注意这里是F E FF,中间有个E
		file.Write(&unicode, 2);  //这句重要
		//file.Write(subfileNum2.GetBuffer(), subfileNum2.GetLength());
		file.Write(_T("文件夹"), wcslen(_T("文件夹")) * sizeof(wchar_t));  //这句重要
		file.Write(subDirectory.at(w), wcslen(subDirectory.at(w)) * sizeof(wchar_t));  //这句重要
		file.Write(_T("的图片数量为:"), wcslen(_T("的图片数量为:")) * sizeof(wchar_t));  //这句重要
		file.Write(subfileNum2, wcslen(subfileNum2) * sizeof(wchar_t));  //这句重要
		file.Write(_T("\r\n"),2);		
	}
	file.Close();
	MessageBox(_T("统计完成"));
}




void CFileSeparationDlg::getNum(CString path, int &i, int &j)
{
	CFileFind  find;
	SetCurrentDirectory(path);//设置当前目录
	bool ret = find.FindFile();
	while (ret)
	{
		ret = find.FindNextFile();
		if (find.IsDots())
			continue;
		else if (find.IsDirectory())//判断是目录
		{
			j++;
			CString str=find.GetFileName();//获取文件夹的名字
			//MessageBox(str);
			subDirectory.push_back(str);
			//getNum(path + '/' + (LPCTSTR)find.GetFileName(), i, j, vector);//递归寻找子目录
		}
		else i++;//文件数增加
	}find.Close();//关闭find
	SetCurrentDirectory(_T("E:\\"));//该函数会占用文件控制权,为避免冲突应将其设置为无关目录	
}

把vector容器中的值写入txt花费了较多的时间,且遇到了CFile写入txt乱码的问题,用以下方法解决

WORD unicode = 0xFEFF;  //这句重要,注意这里是F E FF,中间有个E
		file.Write(&unicode, 2);  //这句重要
		//file.Write(subfileNum2.GetBuffer(), subfileNum2.GetLength());
		file.Write(_T("文件夹"), wcslen(_T("文件夹")) * sizeof(wchar_t));  //这句重要
		file.Write(subDirectory.at(w), wcslen(subDirectory.at(w)) * sizeof(wchar_t));  //这句重要
		file.Write(_T("的图片数量为:"), wcslen(_T("的图片数量为:")) * sizeof(wchar_t));  //这句重要
		file.Write(subfileNum2, wcslen(subfileNum2) * sizeof(wchar_t));  //这句重要
		file.Write(_T("\r\n"),2);//换行		

CFile换行

file.Write(_T("\r\n"),2);//换行		

结果
在这里插入图片描述虽然花了一下午的时间,但是还是有所成就吧,继续加油。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值