MFC总结(一):MFC中文件操作、查找与选择总结(3)

    (三)为保存文件选择路径

    A. 使用SHBrowseForFolder函数创建一个对话框,用于选择路径。其原型为

                    LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi)

其中,返回值是一个指针,一个项目标识符列表,如果用户选择了取消的话,则返回NULL。

输入参数lpbi为BROWSEINFO结构体指针,用于设置对话框的一些属性,其结构分析如下。

typedef struct _browseinfo {
    HWND hwndOwner;         //路径选择对话框的父窗口句柄,可设为this->m_hWnd
    LPCITEMIDLIST pidlRoot; //浏览时的初始根目录,设为NULL时为桌面目录
    LPTSTR pszDisplayName;  //用于保存用户选中的路径
    LPCTSTR lpszTitle;      //对话框标题
    UINT ulFlags;           //指定对话框的一些特性,为一些值的组合
    BFFCALLBACK lpfn;       //处理事件的回调函数,一般设为NULL
    LPARAM lParam;          //应用程序传给回调函数的参数,一般设为NULL
    int iImage;             //保存被选取的文件夾的图片索引,一般设为NULL
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

 B. 当选择了一个路径后,使用函数SHGetPathFromIDList提取出选择的路径。其原型为

        BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl,LPTSTR pszPath)

其中,输入参数pidl为上述SHBrowseForFolder的返回值,输出参数pszPath为所选择路径。调用成功则返回TRUE。

    C. 应用示例。

//更改文件保存路径
void CTestDlg::OnPathselect() 
{
     //调用两个函数SHBrowseForFolder,SHGetPathFromIDList
     LPITEMIDLIST pID;   //定义第一个函数的返回值
     BROWSEINFO lpbi;    //定义其输入值
     char path[MAX_PATH];  //保存路径
     //为lpbi赋值
     memset(&lpbi,0,sizeof(BROWSEINFO));
     lpbi.hwndOwner=this->m_hWnd;	// 父窗口句柄
     lpbi.lpszTitle="请选择保存路径";	// 显示位于对话框左上部的标题
     lpbi.ulFlags=BIF_EDITBOX ;		// 指定对话框的外观和功能的标志
     pID=SHBrowseForFolder(&lpbi);      //选择路径,获取ID
     if(pID!=NULL)    
     {  //如果成功得到
        SHGetPathFromIDList(pID,path);  //获取路径
        GetDlgItem(IDC_PATH)->SetWindowText(path);   //显示路径 
     }
}

(四)选择文件

    A. 使用CFileDialog类,定义一个对象。其构造函数如下。

CFileDialog(
   BOOL bOpenFileDialog,          //为TRUE表示“打开”对话框,为FALSE表示“保存”对话框
   LPCTSTR lpszDefExt = NULL,     //指定默认的文件扩展名
   LPCTSTR lpszFileName = NULL,   //指定默认的文件名
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,   //指定一些风格
   LPCTSTR lpszFilter = NULL,     //指定可供选择的文件类型和相应的扩展名
   CWnd* pParentWnd = NULL,       //父窗口指针
   DWORD dwSize = 0
);

   B. 文件类型和扩展名的书写格式(参数lpszFilter)

    ①文件类型说明和扩展名之间用 | 分割;

    ②同种文件类型的扩展名之间用;分割;

    ③每种文件类型之间用 | 分割;

    ④末尾用 || 指明

 例如,“Data Files(*.xlc;*xls)|*.xlc;*.xls|All Files(*.*)|*.*||”。其中,蓝色表示文件类型说明,粉色表示扩展名。

   C. 定义CFileDialog类对象后,可使用DoModal函数来产生对话框,选择文件。在对话框“确定”返回后,可使用下列函数获取路径和文件名。

    主要函数为:GetPathName,GetFileName,GetExtName, GetFileTile等。

   D. 应用该类成员变量m_ofn可设置初始目录。如 dlg.m_ofn.lpstrInitialDir=_T("C:\\")。

   E. 应用函数GetStartPosition和GetNextPathName可实现选择多个文件的情况。

   F. 一个示例,用于选择单个文件。

//选择发送的文件
void CTestDlg::OnSelectfile() 
{
    CString str;
    CFileDialog dlg(TRUE,NULL,NULL,NULL,
		"DATA Files(*.dat;*.txt)|*.dat;*.txt|All Files(*.*)|*.*||",this);//定义对象
    if(dlg.DoModal()==IDOK)
    {
	str=dlg.GetPathName();    //获取文件名
    }

    UpdateData(TRUE);
    m_nFilePath=str;  //显示路径
    UpdateData(FALSE);
}

(五)在指定目录下查找文件

    A. 使用CFileFind类可查找指定目录下的文件,涉及的函数有查找函数FindFile和FindNextFile,获取文件属性函数和判断文件属性函数,详见MSDN。

    B. 对于查找函数,

BOOL FindFile(
   LPCTSTR pstrName = NULL,  //查找的文件说明
   DWORD dwUnused = 0        //必须为0
);
virtual BOOL FindNextFile(); //返回非0表示还有符合条件的文件,返回0表示是最后一个符合条件的文件 

需要查找的文件名pstrName可设为以下几种:

                               "E:\\VC++\\example.txt"   “E:\\VC++\\ex*.txt”   "E:\\VC++\\*.*"

     C.一个示例。

CFileFind finder;
BOOL bResult = finder.FindFile(_T("C:\\te*.dat"));
while(bResult)
{
    bResult = finder.FindNextFile();
    cout<<(LPCTSTR)finder.GetFileName()<<endl;
} 


(六)获取可执行程序所在的目录

   A. 对于API函数GetCurrentDirectory虽然从字面意思上看是获取当前目录,其实获取的并不是.exe执行文件所在的目录,而是其上一级目录。例如,程序安装在桌面上,我们通过该函数获取的路径是C:\Documents and Settings\Administrator,而不是C:\Documents and Settings\Administrator\桌面。

   B. 如需获取程序执行时所在的目录,可使用另外一个API函数:GetModuleFileName。采用该函数可获取程序当前执行的文件名(包含完整的路径),然后结合_tsplitpath函数可分解出路径、文件名、扩展名,再根据需要进行组合。

   C. 下面是本人在程序中常使用的一个函数:

//获取当前程序运行目录
CString GetCurrentDir()
{
	TCHAR	szFull[_MAX_PATH];		//完整路径
	TCHAR	szDrive[_MAX_DRIVE];	        //盘符
	TCHAR	szDir[_MAX_DIR];		//路径

	//获取程序当前执行文件名(包含完整路径)
	GetModuleFileName(NULL, szFull, _MAX_PATH);
	_tsplitpath(szFull, szDrive, szDir, NULL, NULL);

	_tcscpy(szFull, szDrive);		//盘符
	_tcscat(szFull, szDir);			//路径

	return CString(szFull);			//返回路径
}

(七)关于access函数的应用

      A. 对于access函数知道的人不多,这个函数主要可以用来确定文件或文件夹的访问权限或是否存在。其原型如下:

int _access( 
   const char *path, 
   int mode 
);
       B. 参数path用于指定文件或文件夹路径, mode用于指定模式,其有如下四种:
mode值要判断的模式
00判断是否存在
02判断是否有只写权限
04判断是否有只读权限
06判断是否有读和写权限
  当path指定为文件时,mode可设置上述四个任意的值;当path指定为文件夹时,只能判断其是否存在。

      C. 使用时,必须包含io.h头文件。

      D. 本人曾经使用该函数来判断某文件夹下的某文件是否存在,以确定作相应的处理。


全文完。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值