aMule代码分析(2)——CFileDataIO类和CFile类
aMule中的类很多,Maixee今天选择了两个比较基础的类,均是跟文件操作有关的,分别是CFileDataIO类和CFile类。其中,前者是基类,后者由它派生而出的。具体的继承关系,可以参考这张图:
我们先来看CFileDataIO,代码中对它有这样一段注释,Maxiee粗略地翻译了一下:
这个类提供了安全的文件IO接口。
基本的IO操作的结果只有两种,成功或者抛出异常,因此失败是不能忽略的。现在有三种失败类型,读超过EOF、读时出错和写是出错。在基本的IO操作之上,接口还提供几个函数,用来读写一些简单的数据类型,都采用小端模式,允许跨平台通信。
virtual uint64 Seek (sint64 offset, wxSeekMode from=wxFromStart) const
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
其中,Seek里,调用了doSeek;Read里调用了doRead;Write里调用了doWrite,而这后面的三个函数都是纯虚函数。
这就体现出来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类的修改版。
除了添加CFileDataIO 类的接口实现外,它还增强了对UTF8文件名和 64b file-IO 在windows和unix-like系统下的支持。
不必说,doSeek、doRead、doWrite都在这里实现了,其声明如下:
virtual sint64 doRead (void *buffer, size_t count) const
virtual sint64 doWrite (const void *buffer, size_t count)
virtual sint64 doSeek (sint64 offset) const
不仅如此,对于open,flush等函数,都在这里了:
bool Open (const CPath &path, OpenMode mode=read, int accessMode=wxS_DEFAULT)
bool Create (const CPath &path, bool overwrite=false, int accessMode=wxS_DEFAULT)
bool Flush ()
我们在Open中,会看到一个OpenMode参数,它的内容如下:
enum OpenMode { read, write, read_write, write_append, write_excl, write_safe };
有一个write_safe模式,这是CFile中添加的,其功能是:
如果采用openmode 为'write_safe' 调用open,将会对指定文件加上'.new'后缀,然后会像'write'一样。在关闭文件时,它将会重命名为原始文件。 Close() 必须手动调用——destruct将不会完成这一操作。
另外,我们再来看看CFile的私有属性:
int m_fd //文件描述符
CPath m_filePath //文件路径
bool m_safeWrite //是否启用safeWrite模式
至此,相信对于aMule中表述文件的类CFile,相信我们就有所了解啦~
aMule代码分析(2)——CFileDataIO类和CFile类的更多相关文章
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- [转载] 常用 Java 静态代码分析工具的分析与比较
转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...
- 【转载】常用 Java 静态代码分析工具的分析与比较
摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...
- 常用Java静态代码分析工具的分析与比较
给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...
- cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)
今天我们要讲三个类,这三个类应该算比較简单的 HelpLayer类 NumberLayer类 GetLocalScore类 HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示 ...
- stout代码分析之四:Try类
stout的在异常捕获上遵循于谷歌类似的原则,不适用try...catch...,而是从函数返回值判断异常.Try类正是实现了这样的一个功能. 同Option一样,Try是一个模板类,每个类对象都有两 ...
- 阅读代码分析工具Understand 2.0试用
Understand 2.0是一款源码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实能够大大提高代码阅读效率. 因为Understand功能十分强大,本文不可能详尽地介绍它的全部功能,所 ...
- C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...
- VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...
随机推荐
- JSP的学习(3)——语法知识二之page指令
本篇接上一篇<JSP的学习(2)——语法知识一>,继续来学习JSP的语法.本文主要从JSP指令中的page指令,对其各个属性进行详细的学习: JSP指令: JSP指令是为JSP引擎而设计的 ...
- Servlet的学习之ServletContext(1)
本篇来介绍Servlet中非常重要的对象,如ServletConfig类和ServletContext类,尤其是ServletContext类中的一些方法,本篇先讲述一部分,在下一篇中继续补充. 在对 ...
- 暴力拆解CPU
http://www.ruanyifeng.com/blog/2010/11/cpu_autopsy.htmlhttp://bbs.mydigit.cn/read.php?tid=110272http ...
- java中怎么判断一个字符串中包含某个字符或字符串
public static void main(String[] args) { String str="ABC_001"; ){ System.out.println(" ...
- Windows 7如何建立一个FTP的快捷方式
原来,使用Windows XP的时候,在IE6的地址栏里输入FTP服务器的地址,就可以打开一个资源管理器的界面来管理文件.但是,随着IE的版本的提升或是装了Windows 7,原来的这种方法就不能用了 ...
- ios23- 文件下载(同步和异步)
1.第一步:创建一个单例视图 #import <UIKit/UIKit.h> @interface ios23_downViewController : UIViewController& ...
- HDU 4668 Finding string (解析字符串 + KMP)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出一个压缩后的串,以及一个模式串,问模式串 ...
- Python+Django+SAE系列教程15-----输出非HTML内容(图片/PDF)
一个Django视图函数 必须 接受一个HttpRequest 实例作为它的第一个參数 返回一个HttpResponse 实例 从一个视图返回一个非HTML 内容的关键是在构造一个 HttpRespo ...
- [精读]Spationtemporal Saliency Detection Using Textural Contrast and Its Applications
Spationtemporal Saliency Detection Using Textural Contrast and Its Applications Last Edit 2013/12/3 ...
- 手动配置S2SH三大框架报错(二)
十二月 08, 2013 9:34:39 下午 org.apache.catalina.core.AprLifecycleListener init 严重: An incompatible versi ...