①、文件的创建、打开、关闭;
文件的创建、打开:CFile::Open
文件的关闭:CFile::Close
CFile::modeCreate:以新建方式打开,如果文件不存在,则新建;如果文件已存在,把该文件长度置零,即清除文件原有内容;
CFile::modeNoTruncate:以追加方式打开,如果文件存在,打开并且不将文件长度置零,如果文件不存在,会抛出异常。
一般与CFile::modeCreate一起使用,则文件不存在时,新建一个文件;存在就进行追加操作;
CFile::modeReadWrite:以读写方式打开文件;
CFile::modeRead:以只读方式打开文件;
CFile::modeWrite:以只写方式打开文件;
CFile::modeNoInherit:阻止文件被子进程继承;
CFile::ShareDenyNone:不禁止其它进程读或写访问,打开文件。如果文件已被其它进程以兼容模式打开,则Create失败;
CFile::ShareDenyRead:打开文件,禁止其它进程读此文件。如果文件已被其它进程以兼容模式打开,或被其它进程读,则Create失败;
CFile::ShareDenyWrite:打开文件,禁止其它进程写此文件。如果文件已被其它进程以兼容模式打开,或被其它进程写,则Create失败;
CFile::ShareExclusive:以独占模式打开文件,禁止其它进程对文件的读写。如果文件已经以其它模式打开读写(即使被当前进程),则构造失败;
CFile::ShareCompat:此标志在32位MFC中无效。此标志在使用CFile::Open时映射为CFile::ShareExclusive;
CFile::typeText:对回车换行设置特殊进程(仅用于派生类);
CFile::typeBinary:设置二进制模式(仅用于派生类);
②、文件的读写:
读操作:CFile::Read //当函数的返回值小于参数指定读取的数值时,表明已经读到了文件的末尾;
写操作:CFile::Write
③、读取或写入一行数据:class CStdioFile : public CFile
从文件中读一行数据:CStdioFile::ReadString
写一行数据到文件中:CStdioFile::WriteString
④、文件指针位置的设置:
将文件的指针移动到文件的任意位置:CFile::Seek //※ 如果指定为 CFile::end 的时候,偏移量必须为负数;
将文件指针移动到文件的头部:CFile::SeekToBegin
将文件指针移动到文件的尾部:CFile::SeekToEnd
⑤、刷新缓存数据到文件:CFile::Flush
######################################################
MFC 中的 CFile 及其派生类中没有提供直接进行文件的复制操作,因而要借助于SDK API;
SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()
⑥、文件的复制:CopyFile
若要复制文件夹,可以在目标位置新建一文件夹,然后将源文件夹里面的文件进行遍历,一个一个的复制到目标文件夹内即可!
⑦、文件的重命名或移动[适用于文件夹]:
static CFile::Rename 重命名文件;
MoveFile,※※※注意:该函数不仅可以移动文件,还可以移动目录,包括目录中的文件和子目录,但是目录的移动只能限制在一个驱动器;
即:统一驱动器内为重命名操作,不同驱动器内为移动操作;
⑧、文件的删除:CFile::Remove 或 DeleteFile
如果文件有只读属性怎么办?普通的方法还能删除成功吗?
------------------------------------- End -------------------------------------------
MFC 中的 CFile 及其派生类中没有提供直接进行文件的复制操作,因而要借助于SDK API;
SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()
①、文件的复制:CopyFile
若要复制文件夹,可以在目标位置新建一文件夹,然后将源文件夹里面的文件进行遍历,一个一个的复制到目标文件夹内即可!
②、文件的重命名或移动 [适用于文件夹]:
static CFile::Rename 重命名文件;
MoveFile,※※※注意:该函数不仅可以移动文件,还可以移动目录,包括目录中的文件和子目录,但是目录的移动只能限制在一个驱动器;
即:同一驱动器内为重命名操作,不同驱动器内为移动操作;
③、文件的删除:CFile::Remove 或 DeleteFile
如果文件有只读属性怎么办?普通的方法还能删除成功吗?
④、文件属性信息的获取:CFile::GetStatus
看看其内部 SDK API 的实现;
⑤、文件属性信息的设置:CFile::SetStatus
看看其内部 SDK API 实现;
这回可以成功的将只读属性的文件删除了……方法就是去除文件的只读属性后再进行删除操作;
BOOL DelReadOnlyFile(LPCTSTR lpszPath)
{
DWORD dwRet = GetFileAttributes(lpszPath);
if (dwRet == INVALID_FILE_ATTRIBUTES) return FALSE;
if (dwRet & FILE_ATTRIBUTE_READONLY){
dwRet &= ~FILE_ATTRIBUTE_READONLY;
SetFileAttributes(lpszPath, dwRet);
}
return DeleteFile(lpszPath);
}
⑥、判断文件是否存在:方法也有很多种:
1>、_access 函数;
2>、CreateFile 函数;
3>、FindFirstFile 函数;
4>、GetFileAttributes 函数;
5>、PathFileExists(是 Shell Lightweight Utility APIs 函数:Header: Declared in Shlwapi.h Import Library: Shlwapi.lib)
这里面给大家使用 GetFileAttributes 函数进行讲解:
BOOL TargetIsExist(LPCTSTR lpszPath)
{
BOOL bRet = TRUE;
DWORD dwRet = GetFileAttributes(lpszPath);
if (dwRet == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND){
bRet = FALSE;
}
return bRet;
}
⑦、判断给定路径是文件还是目录:
1>、GetFileAttributes 函数;
2>、PathIsDirectory(是 Shell Lightweight Utility APIs 函数:Header: Declared in Shlwapi.h Import Library: Shlwapi.lib)
3>、……
这里面给大家使用 GetFileAttributes 函数进行讲解:
int TargetIsDirectory(LPCTSTR lpszPath)
{
int iRet = -1;
DWORD dwRet = GetFileAttributes(lpszPath);
if (dwRet == INVALID_FILE_ATTRIBUTES){
iRet = -1;
}else if (dwRet & FILE_ATTRIBUTE_DIRECTORY){
iRet = 1;
}else{
iRet = 0;
}
return iRet;
}
------------------------------------- End -------------------------------------------
①、文件夹的创建:CreateDirectory
※※※ 注意:此函数只能创建一层目录,比如想在 C 盘下的 Temp 目录下创建新目录为:123
那么前提是 Temp 这个目录存在才可以!
②、文件夹的删除:RemoveDirectory
※※※ 注意:此函数只能删除一个空的目录,如果目录中有子目录或子文件的话会删除失败的!
解决的方法是用 递归的思想,调用上节课给大家讲解的文件删除函数将子文件删除,之后就可以调用此函数删除一个空的文件夹了;
③、文件夹属性信息的获取:GetFileAttributes
④、文件和文件夹的遍历操作:(※ 本节课的重点 ※)
MFC 中对文件的遍历操作所支持的类是:CFileFind
⑤、相关示例代码,实现删除非空目录:
BOOL DeleteTargetFolder(LPCTSTR lpstrPath)
{
CString strRootPath(lpstrPath);
if (strRootPath[strRootPath.GetLength()-1] != '\\')
strRootPath = strRootPath + _T("\\");
CFileFind mFinder;
BOOL bFind = mFinder.FindFile(strRootPath + _T("*.*"), 0); //如果指定文件类型的话,只能在本目录中遍历
while (bFind){
bFind = mFinder.FindNextFile();
if (mFinder.IsDots()){
continue;
}else{
if (mFinder.IsDirectory()){
//目标是目录
DeleteTargetFolder(mFinder.GetFilePath());
}else{
//目标是文件
DeleteFile(mFinder.GetFilePath());
}
}
}
mFinder.Close();
RemoveDirectory(strRootPath); //一定要放在 mFinder.Close(); 的下面,否则删除失败,提示文件夹正被使用中
return TRUE;
}