zoukankan      html  css  js  c++  java
  • 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中显示出来。
    }

      

  • 相关阅读:
    javascript 使用链式结构
    javascript 闭包
    javascript 使用canvas绘画
    (14)javascript 函数表达式 递归、闭包
    (13)javascript 面向对象 创建对象
    wpf和winform的区别
    XtraReport1添加参数
    {$DEFINE WANYI}
    $('#myModal').modal('show') //显示$('#myModal').modal('hide')隐藏
    计算机音视频技术
  • 原文地址:https://www.cnblogs.com/zhouwanqiu/p/6918748.html
Copyright © 2011-2022 走看看