aMule代码分析(2)——CFileDataIO类和CFile类
来源:互联网 发布:国外必备软件 编辑:程序博客网 时间:2024/06/05 03:10
aMule中的类很多,Maixee今天选择了两个比较基础的类,均是跟文件操作有关的,分别是CFileDataIO类和CFile类。其中,前者是基类,后者由它派生而出的。具体的继承关系,可以参考这张图:
我们先来看CFileDataIO,代码中对它有这样一段注释,Maxiee粗略地翻译了一下:
这个类提供了安全的文件IO接口。
基本的IO操作的结果只有两种,成功或者抛出异常,因此失败是不能忽略的。现在有三种失败类型,读超过EOF、读时出错和写是出错。在基本的IO操作之上,接口还提供几个函数,用来读写一些简单的数据类型,都采用小端模式,允许跨平台通信。
说到文件操作,我们首先最关注的是open,read,write,seek,flush这些基本操作,但是CFileDataIO没有open,flush,只有这几个函数:
这就体现出来CFileDataIO只是一个接口,它只完成一些抽象的操作,而至于实际的操作,如访问文件,都交由其子类来实现。
所以说,这一份CFileDataIO,它提供的功能,既适用于CFile也适用于CMemFile。
CFileDataIO还提供了一些其他函数,可以简要看一下:
现在,我们再把目光放到CFile类,代码里也包含了对它的介绍,Maixee再粗略地翻译一下:
virtual uint64 Seek (sint64 offset, wxSeekMode from=wxFromStart) const其中,Seek里,调用了doSeek;Read里调用了doRead;Write里调用了doWrite,而这后面的三个函数都是纯虚函数。
virtual void Read (void *buffer, size_t count) const
virtual void Write (const void *buffer, size_t count)
virtual sint64 doSeek (sint64 offset) const =0
virtual sint64 doRead (void *buffer, size_t count) const =0
virtual sint64 doWrite (const void *buffer, size_t count)=0
这就体现出来CFileDataIO只是一个接口,它只完成一些抽象的操作,而至于实际的操作,如访问文件,都交由其子类来实现。
所以说,这一份CFileDataIO,它提供的功能,既适用于CFile也适用于CMemFile。
CFileDataIO还提供了一些其他函数,可以简要看一下:
virtual uint8 ReadUInt8 () const 读UInt8类型的数据
virtual void WriteUInt128 (const CUInt128 &value) 写UInt128
virtual void WriteHash (const CMD4Hash &value) 写哈希
CTag * ReadTag (bool bOptACP=false) const 读TAG
等等这一类的操作
现在,我们再把目光放到CFile类,代码里也包含了对它的介绍,Maixee再粗略地翻译一下:
这个类是wxFile类的修改版。不必说,doSeek、doRead、doWrite都在这里实现了,其声明如下:除了添加CFileDataIO 类的接口实现外,它还增强了对UTF8文件名和 64b file-IO 在windows和unix-like系统下的支持。
virtual sint64 doRead (void *buffer, size_t count) const不仅如此,对于open,flush等函数,都在这里了:
virtual sint64 doWrite (const void *buffer, size_t count)
virtual sint64 doSeek (sint64 offset) const
bool Open (const CPath &path, OpenMode mode=read, int accessMode=wxS_DEFAULT)我们在Open中,会看到一个OpenMode参数,它的内容如下:
bool Create (const CPath &path, bool overwrite=false, int accessMode=wxS_DEFAULT)
bool Flush ()
enum OpenMode { read, write, read_write, write_append, write_excl, write_safe };另外,我们再来看看CFile的私有属性:
有一个write_safe模式,这是CFile中添加的,其功能是:
如果采用openmode 为'write_safe' 调用open,将会对指定文件加上'.new'后缀,然后会像'write'一样。在关闭文件时,它将会重命名为原始文件。 Close() 必须手动调用——destruct将不会完成这一操作。
int m_fd //文件描述符至此,相信对于aMule中表述文件的类CFile,相信我们就有所了解啦~
CPath m_filePath //文件路径
bool m_safeWrite //是否启用safeWrite模式
- aMule代码分析(2)——CFileDataIO类和CFile类
- aMule代码分析(1)——用doxyfile生成文档
- Maxiee的Vim入门日记(6)——用Vim看aMule代码2
- CArchive类和CFile类
- CFile类ReadHuge和WriteHuge
- Maxiee的Vim入门日记(5)——用Vim看aMule代码
- Maxiee的Vim入门日记(7)——用Vim看aMule代码3
- MFC点点滴滴——CStdioFile,CFile类
- CFile类
- CFile类
- CFile类
- CFile类和CFileDialog结合使用(转载)
- 文件操作API和CFile类
- 文件操作API和CFile类
- CFile类和CFileDialog结合使用
- 文件操作API和CFile类
- 文件操作API和CFile类
- 文件操作系列之四——(CFile类的文件操作)
- h264解码器,s3c6410硬件mfc解码分析-H264
- First week:fight with delay evil
- 1.android:整理出15个Android很有用的代码片段(技巧)
- vim记忆上次浏览文件的位置
- linux获取当前进程的CPU使用率
- aMule代码分析(2)——CFileDataIO类和CFile类
- 想爱容易,相处难:当ASP.NET MVC爱上IoC
- java NIO /IO 非阻塞IO 和IO的区别及代码示例
- KDD-2013 Tutorial
- 记录自己的投资心得理会(1)
- Code Style Guidelines for Contributors
- Android 调用已安装市场,进行软件评分的功能实现
- ios摇一摇的实现
- MFC中消息传递