Bootstrap

MFC文件管理-学习笔记

  1. CFileDialog封装用于文件打开操作或文件保存操作的常见对话框,继承于CCommonDialog
  2. CFileDialog的公共数据成员:m_ofn:Windows的OPENFILENAME结构,提供对基本文件对话框参数的访问权限
  3. 使用CFileDialog对象首先要使用构造参数创建该对象,然后设置m_ofn结构中的值初始化对话框控件的值或状态,初始化完成后需要调用CFileDialog::DoModal方法显示对话框,此时通过返回值为IDOK或IDCANCEL判断文件是否打开。
  4. 若要让用户选择多个文件,请在调用 DoModal 之前设置 OFN_ALLOWMULTISELECT 标志。 必须提供自己的文件名缓冲区才能容纳返回的包含多个文件名的列表。 为此,请在构造 CFileDialog 之后(但在调用 DoModal 之前)将 m_ofn.lpstrFile 替换为已分配的缓冲区的指针。
    此外,必须使用 m_ofn.lpstrFile 所指向的缓冲区中的字符数来设置 m_ofn.nMaxFile。 如果将要选择的最大文件数设置为 n,则所需的缓冲区大小为 n * (_MAX_PATH + 1) + 1。 缓冲区中返回的第一项是所选文件所在的文件夹的路径。
    例如:
#define MAX_CFileDialog_FILE_COUNT 99
#define FILE_LIST_BUFFER_SIZE ((MAX_CFileDialog_FILE_COUNT * (MAX_PATH + 1)) + 1)
CString fileName;
wchar_t* p = fileName.GetBuffer( FILE_LIST_BUFFER_SIZE );
**CFileDialog dlgFile(TRUE);
OPENFILENAME& ofn = dlgFile.GetOFN( );
ofn.Flags |= OFN_ALLOWMULTISELECT;
ofn.lpstrFile = p;
ofn.nMaxFile = FILE_LIST_BUFFER_SIZE;//设置缓冲区大小;
//*dlg.ofn.lpstrFilter*设置过滤文件类型
=_T("DAT FILES(*.cfg)\0*.cfg\0All Files(*.*)\0*.*\0\0");//\0加个0目前不知道意义,可读取多级文件夹中的cfg文件类型。
dlgFile.DoModal();**
fileName.ReleaseBuffer();
if(dlgFile.DoModal() != IDOK)
{
return 0;
}
  1. CFile类使用:在afx.h标头中

  2. 公共运算符为CFile::operator HANDLE --CFile 对象的句柄

  3. 公共数据成员有:CFile::hFileNull --确定CFile对象是否具有有效句柄

  4. 例如:if(MyFile.m_hFile != CFile::hFileNull)
    {
    }
    CFile::m_hFile --包含操作系统文件句柄

  5. CFile::Abort为关闭与此对象关联的文件并使改文件不可读取或写入,关闭软件失败时不会引发异常 例如:CStdioFile fileTest; TCHAR* pszFileName = _T("Abort_File.dat"); //执行可能导致异常的操作 CFileException ex; if (!fileTest.Open(pszFileName, CFile::modeWrite, &ex)) { ex.ReportError(); fileTest.Abort(); // 安全关闭文件 }
    使用CFile打开文件官方例子如下:

TCHAR* pszFileName = _T("c:\\test\\myfile.dat");
CFile myFile;
CFileException fileException;
if ( !myFile.Open( pszFileName, CFile::modeCreate |   
        CFile::modeReadWrite, &fileException ) )//fileException的作用是若打开文件出现问题则返回此错误对象,下方TRACE即为追踪打印文件名和指示失败原因代码,更详细的错误报告可使用AfxThrowFileException函数
{
   TRACE( _T("Can't open file %s, error = %u\n"),
      pszFileName, fileException.m_cause );
}

方法二:

HANDLE hFile = CreateFile(_T("CFile_File.dat"),
   GENERIC_WRITE, FILE_SHARE_READ,
   NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
   AfxMessageBox(_T("Couldn't create the file!"));
}
else
{
   // 将 CFile 对象附加到我们拥有的句柄。
   CFile myFile(hFile);
   static const TCHAR sz[] = _T("I love CFile!");
   // 向文件中添加数据
   myFile.Write(sz, sizeof(sz));
   // 我们需要显式调用 Close()。请注意,没有必要对 API 返回的句柄调用 CloseHandle(),因为Close() 会自动为我们调用 CloseHandle()。
   myFile.Close();

其中GENERIC_WRITE表示访问权限为调用放可对对象执行正常的写入操作,GENERIC_READ则表示可对对象执行正常的读取操作;
FILE_SHARE_READ表示请求文件或设备的共享模式,可读取、写入删除等属性,

0如果其他进程请求删除、读取或写入访问权限,则阻止其他进程打开文件或设备。
FILE_SHARE_DELETE启用对文件或设备上的后续打开操作以请求删除访问权限。
FILE_SHARE_READ允许对文件或设备执行后续打开操作以请求读取访问权限。
FILE_SHARE_WRITE允许对文件或设备执行后续打开操作以请求写入访问权限。
CREATE_ALWAYS表示对存在或不存在的文件或设备始终创建新文件:
CREATE_ALWAYS始终创建新文件。
如果指定的文件存在且可写,则函数将截断文件、函数成功
CREATE_NEW仅当该文件尚不存在时,才会创建一个新文件。
OPEN_ALWAYS始终打开文件。
如果指定文件存在,则函数成功
TRUNCATE_EXISTING打开一个文件并截断它,使其大小为零字节,仅当它存在时。
如果指定的文件不存在,该函数将失败
FILE_ATTRIBUTE_NORMAL表示文件或设备属性和标志,此值为默认值。

更详细创建文件描述链接:
如果对文件使用要求不那么高的情况下,可以直接:Cfile File;
CString Str;//文件路径
File.open(Str,CFile::modeCreate | CFile::modeWrite);
if(File == NULL)
{
//错误提示
}
else
{
//写入文件
}
File.Close();

;