讲到文件操作我们会联想到自己手动操作文件会涉及到哪些内容.很容易想到的是查看文件(文件夹)是否存在,创建,复制,删除,剪切文件(文件夹).另外就是设置文件的属性.
那MFC中一些操作文件的类也差不多是会涉及到你如上操作.
查看文件
查看文件你可能凭直观感觉想到用find , search这样的函数.猜的大概不错.MFC中有个类CFileFind,它有个函数FindFile可以来判断文件是否存在.
CFileFind用法
CFileFind fileFind;
CString strFileName;
strFileName = _T("D:\\test.txt");
if(fileFind.FindFile(strFileName) );
除了查看文件是否存在CFileFind类中还有许多其他函数可以得到文件的详细信息.比如
IsReadOnly查看是否只读
IsHidden是否隐藏
GetLastAccessTime 查看上次文件访问时间
GetLength查看文件大小(不过要注意的是调用了FindFile函数后还得再来个fileFind.FindNextFile(),然后再调用fileFind.GetLength()才不会出错)
另外还有个结构体叫CFileStatus,也可以实现类似的一些功能.
CFileStatus用法
struct CFileStatus{
CTime m_ctime; // creation date/time of file
CTime m_mtime; // last modification date/time of file
CTime m_atime; // last access date/time of file
ULONGLONG m_size; // logical size of file in bytes
BYTE m_attribute; // logical OR of CFile::Attribute enum values
BYTE _m_padding; // pad the structure to a WORD
TCHAR m_szFullName[_MAX_PATH]; // absolute path name
}
CFileStatu在CFile的函数GetStatus中会用到,该函数有两个版本
BOOL GetStatus(
CFileStatus& rStatus
) const;
static BOOL GetStatus(
LPCTSTR lpszFileName,
CFileStatus& rStatus
);
其中一个是CFile的普通成员函数,一个是static类型的函数.也可以用该函数判断文件是否存在
CFile file;
CFileStatus fileStatus;
CString strFileName;
strFileName = _T("D:\\test.txt");
if(file.GetStatus(fileStatus)) //或者用CFile:GetStatus(strFileName, fileStatus)
//存在
else
//不存在
查看,创建目录
查看目录是否存在很简单
CString strDirPath = _T("D:\\Temp");
BOOL bExistDir = ::PathFileExists(strDirPath);
创建目录
CString strDirName = _T("D:\\Temp\\Dir");
::CreateDirectory(strDirName,NULL); //要保证Temp是存在的.
创建文件
CFile file;
CFileException exp;
CString strFileName = _T("D:\\temp\\arwen.txt");
//创建文件,如果已经存在文件则会覆盖之前的内容
BOOL bCreateFile = file.Open(strFileName,CFile::modeCreate,&exp);
如果创建失败你想知道详细信息的话可以通过exp.m_cause去获取, 可能的错误信息是
enum {none, genericException,
fileNotFound, badPath,
tooManyOpenFiles, accessDenied,
invalidFile, removeCurrentDir,
directoryFull, badSeek,
hardIO, sharingViolation,
lockViolation, diskFull, endOfFile
}
写文件
假如要往文件中写入些内容
CFile file;
CString strFileName = _T("D:\\temp\\arwen.txt");
CString strInfo = _T("hello,world\n");
int nSize = strInfo.GetLength();
if(file.Open(strFileName,CFile::modeReadWrite,&exp))
{
file.Write(strInfo.GetBuffer(0),nSize);
file.Flush();
file.Close();
}
不过CFile用起来还是不方便,有个继承自它的类CStdioFile,用起来就比较方便
CStdioFile file;
file.WriteString(strInfo);
读文件
CStdioFile file;
file.Open(strFileName,CFile::modeRead);
CString strText;
CString strTemp;
while(file.ReadString(strTemp))
{
strText += strTemp;
}
file.Close();
文件属性设置
假如你读或写文件时不让其他人操作该文件(有点像数据库中的上锁),咋整呢?
file.Open( strFileName, CFile::modeWrite | CFile:shareDenyRead)
CFile:shareDenyRead 就表示你操作时别人也不能读文件.
如果是可让别人读但不能写就是CFile::shareDenyWrite
另外我们经常碰到一些文件时只读的,或者是隐藏的.怎么在代码中设置呢
SetFileAttributes(strFileName, FILE_ATTRIBUTE_READONLY); //设置文件为只读
FILE_ATTRIBUTE_HIDDEN就是表示隐藏
假如你要取消这些属性就这样
SetFileAttributes(strFileName, FILE_ATTRIBUTE_NORMAL);
设置属性还有另外一个方法
CFileStatus status;
CFile::GetStatus(strFileName, status);
status.m_attribute |= CFile::readOnly;
CFile::SetStatus(strFileName, status);