1、相关类
CFile类 -封装了文件句柄以及操作文件的API函数
CFileFind类 -封装了文件搜索功能
2、CFile类的使用
2.1文件读写
1)创建或者打开文件
CFile::Open
virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );
lpszFileName:指定文件的名称;
nOpenFlags:指定文件共享和访问的方式,包括:
CFile::modeCreate --创建新文件,如果该文件已存在,则将它的长度截断为0;
CFile::modeNoTruncate --与CFile::modeCreate合用,如果要创建的文件已存在,它的长度不会被截断;
CFile::modeRead --打开文件,仅用于读操作;
CFile::modeReadWrite --打开文件,可读可写;
CFile::modeWrite --打开文件,仅用于写操作;
CFile::modeNoInherit --禁止子进程继承该文件;
CFile::shareDenyNone --打开文件,同时并不拒绝其他进程对该文件的读取和写入访问;如果该文件已经被其他进程以兼容模式打开,则函数调用失败;
CFile::shareDenyRead --打开文件,并拒绝其他进程对该文件的读取访问;
CFile::shareDenyWrite --打开文件,并拒绝其他进程对该文件的写入访问;
CFile::shareExclusive --以独占模式打开,拒绝其他进程对该文件的读取和写入访问;
CFile::typeText --设置文本模式,带有一对回车换行字符;
CFile::typeBinary --设置二进制模式;
2)文件读写
CFile::Read
virtual UINT Read( void* lpBuf, UINT nCount );
lpBuf:指向用来接收从文件中读取的数据的缓冲区的指针;
nCount:要从文件中读取的最大字节数;
CFile::Write
virtual void Write( const void* lpBuf, UINT nCount );
lpBuf:指向将要被写入文件的数据;
nCount:将要写入的数据的字节数;
CFile::Flush --刷新缓冲区中的数据并将其写入磁盘文件中
virtual void Flush();
3)关闭文件
CFile::Close()
virtual void Close();
2.2文件长度的获取和设置
CFile::GetLength()
CFile::SetLength(ULONGLONG dwLen) //文件会响应地被扩展或截取
2.3文件的指针
CFile::GetPosition() --获得当前文件指针的位置
virtual DWORD GetPosition( ) const;
CFile::Seek
virtual LONG Seek( LONG lOff, UINT nFrom );
lOff:将移动文件指针多少个字节数;
nFrom:移动文件指针的起始位置,包括:
CFile::begin
CFile::current
CFile::end
CFile::SeekToBegin() //将文件指针移到文件开头
CFile::SeekToEnd() //将文件指针移到文件末尾
2.4文件相关属性的读取和设置
1)CFile::GetStatus //获取文件的属性信息,成功返回非0,失败返回0
Bool GetStatus([LPCTSTR strFileName,]CFileStatus& Status)
CFileStatus结构有以下字段:
CTime m_ctime --文件创建的时间
CTime m_mtime --文件最后一次修改的时间
CTime m_atime --最后一次访问文件并读取的时间
LONG m_size --文件逻辑长度,以字节数表示
BYTE m_attribute --文件属性
m_attribute的值包括:normal=0x00 | readOnly=0x01 | hidden=0x02 | system=0x04 | volume=0x08 | directory=0x10 | archive=0x20
Char m_szFullName[_MAX_PATH] --Windows字符集表示的全文件名
2)CFile::SetStatus //设置文件属性信息
SetStatus(LPCTSTR strFileName,CFileStatus& Status)
3)CFile::GetFileName() //获取文件名称,包含扩展名(即使被隐藏)
4)CFile::GetFileTitle() //获取文件显示名称(若系统默认隐藏文件扩展名,则不包含扩展名)
5)CFile::GetFilePath() //获取文件绝对路径
6)CFile::SetFilePath(strNewFilePathName)
7)CFile::Rename(strOldFileName,strNewFileName) //重命名文件,可以利用此函数移动文件到新的路径下并重命名
8)CFile::Remove(strFileName) //删除指定路径文件,可以是相对路径、绝对路径
注意:1、文件读写需要异常处理
2、注意文件的指针位置
例:
if (GetFileAttributes("./1.txt") != INVALID_FILE_ATTRIBUTES) //检测文件是否存在 { CFile file; file.Open("1.txt", CFile::modeCreate | CFile::modeWrite);
//file.Write("hello world!", strlen("hello world!"));
CString str="hello world!";
int strLen=str.GetLength(); file.Write(str, strLen); file.Close(); }
CFile file; if(file.Open("1.txt", CFile::modeRead))
{
char *pBuf;
DWORD dwFileLen;
dwFileLen = file.GetLength();
pBuf = new char[dwFileLen + 1];
pBuf[dwFileLen] = 0;
file.Read(pBuf, dwFileLen);
file.Close();
MessageBox(pBuf);
delete[] pBuf;
}
3、CFileFind类的使用
3.1开始查找(指定查找的目录)
CFileFind::FindFile(strFileName,0); //strName为要查找的文件名,为NULL表示查找“*.*”
成功返回非0,失败返回0
3.2查找下一个(获取当前文件信息,返回下一个文件是否存在)
CFileFind::FindNextFile(); //返回非0表示还有符合条件的下一个文件,返回0表示已是最后一个文件
3.3获取/判断文件信息
CFileFind::GetCreationTime(); //获取文件的创建时间,成功返回非0,失败返回0
virtual BOOL GetCreationTime(FILETIME *pFileTime) const; //FILETIME
*:容纳时间的结构指针
virtual BOOL GetCreationTime(CTime& refTime) const; //CTime&:容纳时间的对象地址
FILETIME和CTime的相互转换:
FILETIME转CTime:
1、CTime对象在初始化时可以传递FILETIME结构
FILETIME ft;
CTime time(ft);
2、将FILETIME转换为SYSTEMTIME,然后CTime对象在初始化时可以传递SYSTEMTIME结构
FILETIME ft;
SYSTEMTIME st;
BOOL bSuccess=::FileTimeToSystemTime(&ft , &st);
CTime time(st);
CTime转FILETIME:
CTime time(CTime::GetCurrentTime());
SYSTEMTIME st;
time.GetAsSystemTime(st);
FILETIME ft;
::SystemTimeToFileTime(&st,&ft);
CFileFind::GetLastAccessTime(); //获取文件最后被访问的时间,成功返回非0,失败返回0
virtual BOOL GetLastAccessTime(FILETIME *pFileTime) const;
virtual BOOL GetLastAccessTime(CTime& refTime) const;
CFileFind::GetLastWriteTime(); //获取文件最后被修改的时间,成功返回非0,失败返回0
virtual BOOL GetLastWriteTime(FILETIME *pFileTime) const;
virtual BOOL GetLastWriteTime(CTime& refTime) const;
CFileFind::GetRoot(); //获取查找到的文件的根目录,必须在执行FindNextFile()后执行该函数,返回CString对象
CFileFind::GetFileName(); //获取查找到的文件的全名(包含扩展名),必须在执行FindNextFile()后执行该函数,返回CString对象
CFileFind::GetFilePath(); //获取查找到的文件的绝对路径,必须在执行FindNextFile()后执行该函数,返回CString对象
CFileFind::GetFileTitle(); //获取查找到的文件的名称(若系统默认隐藏文件扩展名则不显示),必须在执行FindNextFile()后执行该函数,返回CString对象
CFileFind::GetFileURL(); //获取查找到的文件的URL路径,必须在执行FindNextFile()后执行该函数,返回CString对象
CFileFind::GetLength(); //获取查找到的文件的长度DWORD
CFileFind::IsArchived(); //判断查找的文件属性是否是档案文件,必须在执行FindNextFile()后执行该函数,非0表示是,0表示不是
CFileFind::IsCompressed(); //判断查找的文件属性是否是压缩文件,必须在执行FindNextFile()后执行该函数
CFileFind::IsDirectory(); //判断查找的文件属性是否为路径文件(文件夹),必须在执行FindNextFile()后执行该函数
CFileFind::IsDots(); //判断查找的文件属性是否是“.”、“..”,必须在执行FindNextFile()后执行该函数
CFileFind::IsHidden(); //判断查找的文件属性是否为隐藏文件,必须在执行FindNextFile()后执行该函数
CFileFind::IsNormal(); //判断查找的文件属性是否为正常文件,必须在执行FindNextFile()后执行该函数
CFileFind::IsReadOnly(); //判断查找的文件属性是否为只读文件,必须在执行FindNextFile()后执行该函数
CFileFind::IsSystem(); //判断查找的文件属性是否为系统文件,必须在执行FindNextFile()后执行该函数
CFileFind::IsTemporary(); //判断查找的文件属性是否为临时文件,必须在执行FindNextFile()后执行该函数
CFileFind::MatchesMask(DWORD dwMask); //判断查找的文件的综合属性,必须在执行FindNextFile()后执行该函数
dwMask参数包括:
FILE_ATTRIBUTE_ARCHIVE:档案文件
FILE_ATTRIBUTE_COMPRESSED:压缩文件
FILE_ATTRIBUTE_DIRECTORY:路径文件
FILE_ATTRIBUTE_NORMAL:正常文件
FILE_ATTRIBUTE_READONLY:只读文件
FILE_ATTRIBUTE_SYSTEM:系统文件
FILE_ATTRIBUTE_TEMPORARY:临时文件
FILE_ATTRIBUTE_HIDDEN:隐藏文件
3.4结束查找
CFileFind::Close();
CFileFind fFinder; BOOL bFind = fFinder.FindFile(TEXT("D:/*.*")); while (bFind) { bFind = fFinder.FindNextFile(); //当前文件夹及上层文件夹(名称分别为..)----------------- if (fFinder.IsDots()) { continue; } //子文件夹--------------------------------------------- if(fFinder.IsDirectory()) { CString cstrDirName = fFinder.GetFileName(); //directory name CString cstrDirPath = fFinder.GetFilePath(); //directory path continue; } //文件------------------------------------------------- CString cstrFileName = fFinder.GetFileName(); //file name CString cstrFilePath = fFinder.GetFilePath(); //file path } fFinder.Close();
相关问题:
CFileFind 类中返回的文件顺序与文件系统有关,如果是NTFS和CDFS文件系统,是以文件的字母顺序排列的,FAT文件系统下,是以文件增加的先后顺序排列的,而不是按字母顺序。
利用CFileFind类查找文件时会出现重复现象,其原因也是跟文件系统类型有关,通常的解决方法:先将CFileFind类查找到的文件全部保存下来,然后再进行处理;切勿交叉处理。另外一种简单的排序方法:每查到一个文件,随后将其加入CListBox控件中显示(CListBox风格中得选中sort),因为CListBox控件有自动排序功能,这样你所需的文件就自动排序了
如:
在OnInitDialog()函数中添加如下代码,再结合ListBox控件用。 CFileFind finder; BOOL bWorking = finder.FindFile(".\\zwq\\*.txt"); while (bWorking) { bWorking = finder.FindNextFile(); m_lbSurface.AddString ((LPCTSTR) finder.GetFileName());//m_lbSurface为listbox控件的关联变量,此句是将文件名添加到listbox中显示出来。 }