文件的操作分为两步,打开和读写。
打开和读写对应着两个类,分别 CFileDialog 和 CFile.
第一步 打开文件对话框操作:
(1) 文件对话框类 CFileDialog
(2) 构造方法 CFileDialog::CFileDialog();
CFileDialog::CFileDialog( BOOL bOpenFileDialog**, LPCTSTR** lpszDefExt = NULL, LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
参数介绍:
bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。 如"jpg"。
lpszFileName 指定默认的文件名。 如"*.jpg"。
dwFlags 指明一些特定风格。如:dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT。
OFN_HIDEREADONLY 隐藏只读复选框。
OFN_OVERWRITEPROMPT 如果选择的文件已经存在,使用另存为对话框产生一个消息框;
用户必须确认是否复盖这个文件。
lpszFilter 是很重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"jpg Files (*.jpg)|*.jpg|bin Files (*.bin)|*.bin|All Files (*.*)|*.*||";
文件类型说明和扩展名间用 | 分隔,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 为父窗口指针,一般为空。
(3) 打开对话框方法 CFileDialog::DoModal(); 用来打开对话框。
(4) 取得完整文件名方法 CFileDialog::GetPathName();
得到完整的文件名,包括目录名和扩展名如:c:\test\test1.txt。
构造和打开对话框用例:
char szFilters[]="jpg Files (*.jpg)|*.jpg|bin Files (*.bin)|*.bin|All Files (*.*)|*.*||";
CFileDialog fileDlg(TRUE, "jpg", "*.jpg",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilters, NULL);
if( fileDlg.DoModal ()==IDOK ) //此时,才真正弹出对话框。
{
gReadFilePathName = fileDlg.GetPathName(); //得到完整的文件名、目录和扩展名。
GetDlgItem(IDC_EDIT1)->SetWindowText(gReadFilePathName); //将文件名、目录和扩展名写回窗口。
}
第二步 读写文件操作:
(1) 文件类 CFile
(2) 构造方法 CFile::CFile();
CFile::CFile**( LPCTSTR** lpszFileName**, UINT** nOpenFlags );
lpszFileName 文件名
nOpenFlags 打开方式,有:
CFile::modeCreate:以新建方式打开,如果文件不存在,新建;
如果文件已存在,把该文件长度置零,即清除文件原有内容。
**CFile::modeRead:**只读。
**CFile::modeWrite:**只写。
**CFile::modeReadWrite:**以读写方式打开文件。
CFile::modeNoTruncate:以追加方式打开,如果文件存在,打开并且不将文件长度置零,如果文件不存在,会抛出异常。
一般与CFile::modeCreate一起使用,则文件不存在时,新建一个文件;存在就进行追加操作。
用例如下:
CFile ReadFile(gReadFilePathName,CFile::modeRead);
CFile SaveFile(gSaveFilePathName,CFile::modeCreate|CFile::modeWrite);
(3) 只读方法 CFile::Read();
CFile::Read**( void*** lpBuf**, UINT** nCount ); 从lpBuf指向的地址开始读取nCount 个字节,指针也自动下移nCount .
lpBuf 文件指针
nCount 字节数
用例如下:
unsigned char temp;
ReadFile.Read(&temp,1);
(4) 只写方法 CFile::Write();
CFile::Write**( const void*** lpBuf**, UINT** nCount ); 向lpBuf指向的内存地址写入nCount 个字节,指针也自动下移nCount .
lpBuf 文件指针
nCount 字节数
用例如下:
char ChangRun[2] = {'\r','\n'};
SaveFile.Write(ChangRun,2);
(5) 定位方法 CFile::Seek();
CFile::Seek( LONG lOff**, UINT** nFrom **); ** 从指定位nFrom置偏移lOff字节.
nFrom 有三种方式,如:
CFile::begin 从文件开始移动
CFile::current 从当前位置移动
CFile::end 从文件末位移动,此时lOff为负值.
用例如下:
SaveFile.Seek(2,CFile::current);