MFC文件读写操作

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中显示出来。
}

 

 

  

 

posted @ 2017-05-29 18:51  Autumn_n  阅读(7158)  评论(0编辑  收藏  举报
TOP