MFC文件输入与输出CFile基本类(MFC新手笔记)

1 篇文章 0 订阅
1 篇文章 0 订阅

            MFC文件输入与输出
一.CFile类的构造函数
  CFile类是MFC中文件操作的基类,它直接提供二进制文件的输入输出服务。CFile通过它的派生类支持
 文本文件和内存文件的操作。
  CFile()构造函数是多态的,与CFile()同名的构造函数有3种形式:
 1.CFile::CFile();
  并不打开文件,而是将m_hFile设为CFile::hFileNull。m_hFile中常包含一个打开的文件
  的句柄,使用这种函数,还需要用CFile::Open()打开文件,用CFile::Close()关闭文件。


 2.CFile::CFile(int hFile);
  这是只带一个参数的构造函数,参数hFile是一个已经打开的文件句柄,此时不对文件的属性
  和访问方式作任何的检验,当CFile()类的对象被销毁时,文件也不会被关闭,程序员要另行
  关闭文件。
   
 3.CFile::CFile(LPCTSR LPszFileName, UINT nOpenFlags);
  这是CFile最完整的构造函数
  参数说明:
   LPszFileName:一个字符串,用以说明文件路径和文件名,路径可以是相对的也可以使绝对的。
   nOpenFlags:文件共享和访问方式的标志。该标志用来指定打开文件后可以对文件进行的操作,
    也可以同时取两个标志,下列是标识式位的取值及其含义:
    (1)CFile::modeCreate   Directs the constructor to create a new file. If
            the file exists already, it is truncated to 0 length.
    (2)CFile::modeNoTruncate   Combine this value with modeCreate. If the file
            being created already exists, it is not truncated to 0 length.
            Thus the file is guaranteed to open, either as a newly created
            file or as an existing file. This might be useful, for example,
            when opening a settings file that may or may not exist already.
            This option applies to CStdioFile as well.
    (3)CFile::modeRead   Opens the file for reading only.
    (4)CFile::modeReadWrite   Opens the file for reading and writing.
    (5)CFile::modeWrite   Opens the file for writing only.
    (6)CFile::modeNoInherit   Prevents the file from being inherited by child processes.
    (7)CFile::shareDenyNone   Opens the file without denying other processes
            read or write access to the file. Create fails if the file has
            been opened in compatibility mode by any other process.
    (8)CFile::shareDenyRead   Opens the file and denies other processes
            read access to the file. Create fails if the file has been opened
            in compatibility mode or for read access by any other process.
    (9)CFile::shareDenyWrite   Opens the file and denies other processes
            write access to the file. Create fails if the file has been opened in
            compatibility mode or for write access by any other process.
    (10)CFile::shareExclusive   Opens the file with exclusive mode, denying other
            processes both read and write access to the file. Construction fails if
            the file has been opened in any other mode for read or write access, even by
            the current process.
    (11)CFile::shareCompat   This flag is not available in 32 bit MFC. This flag maps to
            CFile::shareExclusive when used in CFile::Open.
    (12)CFile::typeText   Sets text mode with special processing for carriage return–linefeed
            pairs (used in derived classes only).
    (13)CFile::typeBinary   Sets binary mode (used in derived classes only).
   
二.CFile中一些其他构造函数:
    1.Abort()
        可关闭文件及CFile对象,使文件不能再被读写。在处理异常方面,Abort与Close不同。
        Abort将无视任何警告和错误,甚至文件根本就没有打开或早已关闭,Abort也不警告。
                   
    2.Open函数
        定义形式:virtual BOOL Open(LPCTSTR lpszFileName, UINT  nOpenFlags,    
                                    CFileException * pError = NULL);
        参数说明:
            lpszFileName:描述文件名和文件路径的字符串,可以是相对路径,也可以是绝对路径,
                    但还不支持网络路径。
            nOPenFlags:文件共享和访问方式的标志。
            pError:指向一个存在的文件异常处理对象,其中存放异常状态。
               
    3.Close函数
        定义形式: virtual void Close( );   
        功能: 关闭文件,禁止其他的读写操作,关闭后Close将m_hFile置为CFile::hFIleNull。

    4.Duplicate函数
        定义形式: virtual CFile * Duplicate() Const;
        为给定文件构造一个复制文件对象,这与C运行库的_dup函数的功能相当。
       
三.输入输出方法
    1.Read函数
        定义形式: virtual UINT Read(void * lpBuf, UINT nCount);
        参数说明:
            lpBuf: 指向用户提供的缓冲区的指针,接受文件中读来的数据。
            nCount: 从文件中读出最大字节数,对文本文件,回车与换行符被当作一个字符。
        功能: 将文件中的数据读入缓冲区,文本事先已被打开,并且是可读的。
        备注: 读操作完毕后文件定位指针读后的下一个字节,如读100个字节,指针就在101字节。
            所以要注意根据需要调整文件指针定位。

    2.Write函数
        定义形式: virtual void Write(const void * lpBuf, UINT nCount);
        参数说明:
            lpBuf: 指向用户提供的缓冲区的指针,该缓冲区暂存要写入文件的数据。
            nCount: 向文件写入内容的字节数,对文本文件,回车与换行符被当作一个字符。
        功能: 将缓冲区的内容写到文件当前的位置。文本事先已被打开,并且是可写的。
        备注: CArchive::Flush()
            作用:The member function Flush ensures that all data is transferred
                from the archive to the file
   
四.文件定位函数
    1.Seek()函数
        定义形式: virtual LONG Seek(LONG lOff, UINT nFrom);
        参数说明:
            lOff: 移动指针的字节数,即要移动多少字节位移。
            nFrom: 移动方式的标志,该标志说明从何处开始计算字节数,向什么地方移动。
                可能取值:
        (1)CFile::begin   将文件定位指针从文件起点向前移动lOff位字节。
        (2)CFile::current 将文件定位指针从文件当前位置向前移动lOff位字节。
        (3)CFile::end    将文件定位指针移动到距离文件结尾lOff个字节的位置。lOff必须
                        是负值,否则指针会越过文件末尾,定位在根本不属于该字节的字节上。
        返回值: 新的指定位置的绝地位置值,即相对于文件头的位置。
        备注: Seek()函数可以在打开的文件中随意地移动文件指针,这样配合Read()和Write()
            函数就可以随意地进行文件的读写操作。
           
    2.SeekToBegin(): 将文件定位指针移动到文件头,相当于Seek(0L, CFile::begin);
    3.SeekToEnd(): 将文件定位指针移动到文件尾,相当于Seek(0L, CFile::end);
    4.GetLength(): 用来取得文件长度,其返回值就是文件的长度,返回值是DWORD型。
                (定义形式: virtual DWORD GetLength( ) const;)
    5.SetLength():
        定义形式: virtual void SetLength( DWORD dwNewLen );
        参数说明: dwNewLen: 期望的文件长度,该值可以大于或小于当前文件的大小。文件将会根据
                设置而进行适当的扩展和截断。
        功能: 设置文件长度。
       
五.其他CFile类成员函数
    1.LockRange()函数
        定义形式: virtual void LockRange(DWORD dwPos, DWORD dwCount);
        功能: 在打开的文件中”锁定“一定范围的数据。锁定后的数据就不能被其他的进程访问了。这
            起到了保护数据的作用。
        参数说明:
            dwPos:待锁定数据在文件中的起始位置;
            dwCount: 待锁定数据的长度。
        备注: 在同一个文件中可以锁定多块数据,但多块数据间不允许有重叠部分。
           
    2.UnLockRange(DWORD dwPos, DWORD dwCount)
        定义形式: virtual void UnLockRange(DWORD dwpos, DWORD dwCount);
        参数说明:
            dwPos:待解锁数据在文件中的起始位置;
            dwCount: 待解锁数据的长度。
        功能: 对锁定在指定文件中的数据进行解锁。
       
    3.文件状态函数
        3.1 GetPosition()
            定义形式: virtual DWORD GetPosition( ) const;
            功能: 获取文件的状态。
            返回值: The file pointer as a 32-bit doubleword.
           
        3.2 GetStatus()
            定义形式: BOOL GetStatus(CFileStatus& rStatus) const;
                    或者 static BOOL PASCAL GetStatus(LPCTSTR lpszFileName,
                                                    CFileStatus& rStatus);
            功能: 获取文件的状态。
            参数说明:
                rStatus: 存放文件状态信息的结构体。
                lpszFileName: 要求获取文件信息文件的路径,可以是绝对路径,也可以是
                        相对路径。但不能是网络路径。
            返回值: 成功 TRUE,失败 FALSE。
            备注:
                (1)CFileStatus结构体成员:
                    CTime m_ctime        文件创建的时间和日期
                    CTime c_time        文件最近被修改的时间和日期
                    CTime m_atime        文件最近被访问的时间和日期
                    LONG a_size         文件的逻辑长度
                    BYTE m_attribute    文件属性标志
                    Char m_szFullName[_MAX_PATH]    文件的绝对文件名
                (2)GetStatus()允许在不打开文件的情况下获取文件信息,它在检测文件是否存在和
                    文件的存取权限时非常有用。
                   
        3.3 GetFileName()
            定义形式: virtual CString GetFileName( ) const;
            返回值: 指定文件的文件名称。
           
        3.4 GetFilePath()
            定义形式: virtual CString GetFilePath( ) const;
            返回值: 指定文件的完整路径。
           
        3.5 GetFileTitle()
            定义形式:  virtual CString GetFileTitle() const;
            返回值: 指定文件标题。
           
        3.6 SetFilePath()
            定义形式: virtual void SetFilePath( LPCTSTR lpszNewName:  );
            参数说明: lpszNewName: 指向新路径的字符串的指针。
           
六. CFile类的派生类
    1.CStdioFile类
        CStdioFile类不支持CFile类的复制文件Duplicate(),锁定文件LockRange()和
        解锁函数UnLockRange(),如果在CStdioFile类中使用这些函数则会产生CNotSupported
        Exception异常,即C不支持的调用异常。
       
        1.1 CStdioFile::ReadString()
            定义形式1: virtual LPCTSTR ReadString(LPCTSTR lpsz, UINT nMax);
            参数说明:
                lpsz: 用户定义的缓存指针, 用来接受读来的字符串;
                nMax: 要读字符串长度,不算结尾的空字符。
            返回值: 返回一个字符串型的指针,如果到了文件结尾还没有读到任何字符,则返回NULL。
                   
            定义形式2: BOOL ReadString(CString& rString);
            参数说明:
                rString: CString类对象,用以接收读来的字符串。
            返回值: 成功 TRUE 如果到了文件结尾还没有读到任何字符返回FALSE。
           
            备注: ReadString()所能读出来的字符数不超过nMax-1,因为缓冲中的最后一个字符被回车符
            占用,它是ReadString()自动加上的,对于小于nMax-1的串,缺少的部分将由null字符填充。
           
        1.2 CStdioFile::WriteString()
            定义形式: virtual void WriteString(LPCTSTR lpsz);
            参数说明: lpsz: 执行字符串缓冲的指针。缓冲中存放着要写入的文本,该文本是以null字符
            ('\0')结尾。他不会将'\0'结尾写入文件。
           
    2.CMemFile类
        CMemFile对象所创建的内存文件是自动打开的,不必再调用CFile::Open之类的函数,因为对磁盘
        操作的打开和关闭文件不再适用于CMemFile对象。CMemFile类也不支持CFile::CDuplicate()
        文件复制函数、锁定函数LockRange()和解锁函数UnLockRange()。
        2.1 Attach()
            定义形式:
                void Attach( BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes = 0 );
            参数说明:
                lpBuffer: Pointer to the buffer to be attached to CMemFile.
                nBufferSize: An integer that specifies the size of the buffer in bytes.
                nGrowBytes: The memory allocation increment in bytes.
            功能: 将内存块附到CmemFile对象。
           
        2.2 Detach()
            定义形式: BYTE * Detach( );
            功能: 将一内存块从CMemFile对象上分离出来。
            返回值: 返回分离出的内存指针。
           
        2.3 Alloc()
            定义形式: BYTE * Alloc( DWORD nBytes );
            参数说明: nBytes: 要分配内存的字节数。
            功能: 虚拟函数内存分配操作。
            返回值: 成功 返回被分配的内存块的指针; 失败 返回NULL。
           
        2.4 Free()
            定义形式: void Free(BYTE * lpMem);
            参数说明: lpMem: 要释放的内存块的指针。
            功能: 解除内存配置,很有可能再分配内存。
           
        2.5 Realloc()
            定义形式: BYTE * Realloc( BYTE* lpMem, DWORD nBytes );
            参数说明:
                lpMem: 指向要重新分配内存的内存块的指针;
                nBytes: 内存块新的大小。
            功能: 重新分配内存。
            返回值: 成功 返回重新分配内存的内存块的指针; 失败 返回NULL。
           
        2.6 Memcpy()
            定义形式:
                BYTE * Memcpy( BYTE* lpMemTarget, BYTE* lpMemSource, UINT nBytes );
            参数说明:
                lpMemTargt: 指向目标内存的指针;
                lpMemSource: 指向源内存的指针;
                nBytes: 要复制的字节数。
            功能: 对内存文件进行拷贝。
            返回值: lpMemTarget的副本。
       
        2.7 GrowFile()
            定义形式: void GrowFile( DWORD dwNewLen );
            参数说明: dwNewLen: New size of the memory file.
            功能: 处理内存文件增长。
           
    3.CSharedFile类
        CSharedFile类同样是CFile类的子类,他支持共享内存文件的创建和操作。CSharedFile与其他的
        内存文件不同的地方是它是由Windows全面内存分配的内存。也就是说CSharedFile对象所存储的数据
        位于全局内存堆中,这块内存可以用于DDE(动态数据交换)、剪贴板以及其他的OLE/COM的统一数据传
        递操作等。
       
        3.1 GlobalAlloc()(全局内存分配函数)(此函数不是CSharedFile类定义的成员函数)
            定义形式: HGLOBAL GlobalAlloc(UINT uFlags, DWORD dwBytes);
            参数说明:
                uFlags: 分配属性
                dwBytes: 分配字节数
            返回值: HGLOCAL型的句柄。
            备注: CSharedFile对象不使用内存映像文件,数据也不是直接在进程中共享。
       
        3.2 SetHandle()
            定义形式: void SetHandle( HGLOBAL hGlobalMemory, BOOL bAllowGrow = TRUE );
            参数说明:
                hGlobalMemory: 要附到CSharedFile对象的全局内存的句柄;
                nAllowGrow: 指定的内存块是否能被增长。
            功能: 将内存块附到CSharedFile对象。
               
        3.3 Detach()
            定义形式: HGLOBAL Detach();
            功能: 将一内存块从CMemFile对象上分离出来,并返回分理出的内存。
               
总结
 使用CFile类实现文件操作的步骤可以概括为:
 1.生成CFile对象并用Open函数打开文件;
 2.使用Seek()函数进行文件指针定位;
 3.输出输入方法Read()函数和Write()函数进行文件读写操作;
 4.使用Close函数关闭文件。
 此外还可以使用Win32 API实现文件的拷贝、重命名、删除等操作。

注:一些释义来自MSDN,恐译后失去原意,故使用英字原文。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值