一系列MFC操作文件实例(上)

一、创建一文件txt

UpdateData(FALSE);

表示更新控件变量-》控件上

UpdateData(TRUE);

表示更新控件-》控件变量上


如下图所示:

一系列MFC操作文件实例(上)_第1张图片

这里将CEditControl设置成CString m_Name类型变量,在创建按钮下创建消息处理函数,代码如下:

void CcjFileDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	TCHAR szFilter[] = _T("ALL Files(*.TXT)|*.TXT||");
	CFileDialog dlg(FALSE, NULL, m_Name, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter, AfxGetMainWnd());

	if(dlg.DoModal() == IDOK)
	{
		CString m_path = dlg.GetPathName();
		if (m_path.Right(4) != ".TXT" && m_path.Right(4) != ".txt")
		{
			m_path += ".TXT";
		}

		CFile file;
		file.Open(m_path, CFile::modeCreate);
		file.Close();
		MessageBox(_T("完成创建"));
	}

	UpdateData(FALSE);

}


二、复制文件

一系列MFC操作文件实例(上)_第2张图片

两个EDIT CONTROL控件绑定在CString变量下,同时对选择源文件和目标文件夹建立消息处理函数

void Ccopy_mfcDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	TCHAR szText[] = "ALL Files(*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szText, AfxGetMainWnd());
	if (dlg.DoModal() == IDOK)
	{
		m_oFile = dlg.GetPathName();
		m_FileExt = dlg.GetFileExt();
		UpdateData(FALSE);
	}
}


void Ccopy_mfcDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("All Files(*.*)|*.*||"), AfxGetMainWnd());

	CString strText = ".";
	strText += m_FileExt;
	if (dlg.DoModal() == IDOK)
	{
		m_nFile = dlg.GetPathName();

		if (m_nFile.Right(4) != strText)
		{
			m_nFile += strText;
		}
		UpdateData(FALSE);
	}
}
在复制中调用CopyFile来实现复制功能

代码如下:

void Ccopy_mfcDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData();
	BOOL ret = CopyFile(m_oFile, m_nFile, TRUE);
	if (ret)
	{
		MessageBox(_T("复制成功"), _T("提示"), MB_OK);
	}
	else
	{
		MessageBox(_T("复制失败"), _T("提示"), MB_OK);
	}
}

三、删除文件

一系列MFC操作文件实例(上)_第3张图片

EC控件绑定在CString控件变量

两个按钮消息响应函数为:

void CdeletecxDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE, NULL, NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("All Files(*.*)|*.*||"), this);

	if (dlg.DoModal() == IDOK)
	{
		m_Path = dlg.GetPathName();
		UpdateData(FALSE);
	}
}


void CdeletecxDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData();
	BOOL ret = DeleteFile(m_Path);
	if (ret)
	{
		MessageBox(_T("删除成功"),_T("提示"), MB_OK);
	}
	else
	{
		MessageBox(_T("删除失败"),_T("提示"), MB_OK);
	}
}

四、重命名

一系列MFC操作文件实例(上)_第4张图片

EDITCONTRL绑定变量CString,分别为m_Path,m_Name.

代码如下:

void Crename1Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("FILE(*.*)|*.*|"), NULL);

	if (dlg.DoModal() == IDOK)
	{
		CString pathname = dlg.GetPathName();
		m_Path.SetWindowText(pathname);
		m_FileName = dlg.GetFileName();
	}

}


void Crename1Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CString name, path, newpath;

	m_Path.GetWindowText(path);
	m_Name.GetWindowText(name);

	newpath = path;
	newpath.Replace(m_FileName, name);

	_trename(path, newpath);
	MessageBox(_T("完成"));
}

五、重命名all

一系列MFC操作文件实例(上)_第5张图片

列表为ListC控件,在view中选择list表示,且绑定CListCtrl m_filelist;变量。

二个消息处理函数如下:

void CrenameAllDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE,_T("FILE"), _T("*.*"), OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,
		_T("FILE(*.*)|*.*|jpeg(*.jpg)|*.jpg|文本(*.txt)|*.txt||"),NULL);

	if (dlg.DoModal() == IDOK)
	{
		POSITION pos = dlg.GetStartPosition();
		while(pos != NULL)
		{
			CString pathname = dlg.GetNextPathName(pos);
			m_filelist.InsertItem(m_filelist.GetItemCount(), pathname);
		}
	}
}

void CrenameAllDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strname, strtemp, nametemp, strext, oldname;
	GetDlgItem(IDC_EDNAME)->GetWindowText(strname);
	if(strname.IsEmpty())return;
	int cout = m_filelist.GetItemCount();
	for (int i = 0; i < cout; i++)
	{
		nametemp = m_filelist.GetItemText(i,0);
		strtemp = m_filelist.GetItemText(i,0);
		oldname = m_filelist.GetItemText(i,0);
		if(strtemp.Right(4).GetAt(0) == '.')
			strext = strtemp.Right(3);
		else
		{
			if(strtemp.Right(2).GetAt(0) == '.')
				strext = strtemp.Right(1);
			else
				strext = "";
		}
		int pos = nametemp.Find(_T("\\"));
		while (pos > 0)
		{
			nametemp = nametemp.Right(nametemp.GetLength() - 1 - pos);
			pos = nametemp.Find(_T("\\"));
		}
		strtemp = strtemp.Left(strtemp.GetLength() - nametemp.GetLength());
		CString temp;
		temp.Format(_T("%s%s%d.%s"),strtemp,strname,i,strext); //前缀,重命名,i,扩展名

		_trename(oldname,temp);
	}
	MessageBox(_T("批量重命名成功"));
}

这里第一个消息处理函数是一个个添加上去,我们这里稍作修改一次就全部添加,代码如下:

void CrenameAllDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码

	CString strDir;        //存选择的该目录
	CString strPathTemp;   //存文件夹地址
	CFileFind Finder;
	TCHAR szPath[_MAX_PATH];//保存路径变量  
	BROWSEINFO bi;  
	bi.hwndOwner = NULL;  
	bi.pidlRoot = NULL;  
	bi.lpszTitle = _T("选择一个文件夹");  
	bi.pszDisplayName = szPath;  
	bi.ulFlags = BIF_RETURNONLYFSDIRS;  
	bi.lpfn    = NULL;  
	bi.lParam  = NULL;  

	LPITEMIDLIST pItemlDList = SHBrowseForFolder(&bi);   //显示一个对话框,让用户选择一个文件夹  
	if (pItemlDList)  
	{  
		if (SHGetPathFromIDList(pItemlDList, szPath))  
		{  
			strDir = szPath;  
		}  
	}  
	else  
	{  
		strDir = "";  
	}  
	
	
	if (strDir.Right(1) != "\\")
	{
		strDir += "\\";
	}

	strPathTemp = strDir;
	strDir += "*.*";

	bool bf = Finder.FindFile(strDir);
	while (bf)
	{
		bf = Finder.FindNextFile();
		CString DataFile = Finder.GetFilePath();
		if (Finder.IsDirectory()&&Finder.IsDots())  //如果是目录的话,跳过
		  continue;
		CString PathName = strPathTemp  + Finder.GetFileName();
		m_filelist.InsertItem(m_filelist.GetItemCount(), PathName);
	}

}



六、提取文件夹下所有文件名

一系列MFC操作文件实例(上)_第6张图片

listBox控件并绑定了CListBox m_list变量,二个消息处理函数如下:

void CwenjianjiaxinxitiquDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CString ReturnPach;     //
	TCHAR szPath[_MAX_PATH];//保存路径变量
	BROWSEINFO bi;
	bi.hwndOwner = NULL;
	bi.pidlRoot = NULL;
	bi.lpszTitle = _T("选择一个文件夹");
	bi.pszDisplayName = szPath;
	bi.ulFlags = BIF_RETURNONLYFSDIRS;
	bi.lpfn    = NULL;
	bi.lParam  = NULL;

	LPITEMIDLIST pItemlDList = SHBrowseForFolder(&bi);   //显示一个对话框,让用户选择一个文件夹
	if (pItemlDList)
	{
		if (SHGetPathFromIDList(pItemlDList, szPath))
		{
			ReturnPach = szPath;
		}
	}
	else
	{
		ReturnPach = "";
	}
	Path = ReturnPach;

}


void CwenjianjiaxinxitiquDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码

	m_list.ResetContent();
	CFileFind file;
	if(Path.Right(1) != "\\")
		Path += "\\*.*";
	else
		Path += "*.*";

	BOOL bf;
	bf = file.FindFile(Path);   //开始遍历文件夹下有没有文件或文件夹

	int i = 1;

	while(bf)                  //bf为1,表示仍有nextFile
	{
		bf = file.FindNextFile();

		if (!file.IsDots())  //如果文件为"."或者"..",则为真,表示其为一目录
		{
			CString str;
			str.Format(_T("%d"), i);
			strName = file.GetFileName();
			m_list.AddString(strName);
			i++;
		}
	}
}

注:

if(finder.IsDirectory() && !finder.IsDots()) //如果是目录
IsDirectory()判断是否目录
IsDots()) 判断目录是否为“.”或".."
在dos中每个目录下都有缺省的两个目录分别为"."和".."分别表示上一层目录和本层目录.
因此当我们遍历目录树下的文件时要过滤掉这两个缺省目录。
每个文件夹都有下面两个特殊子文件夹:
(1) . 表示本文件夹自己
(2) .. 表示本文件夹的父文件夹
显然,在文件夹遍历的时候,这两个子文件夹需要特殊处理,否则将陷入死循环。
IsDots():就是判断是不是这两个文件夹的一个.

 
 

你可能感兴趣的:(一系列MFC操作文件实例(上))