aMule中的类很多,Maixee今天选择了两个比较基础的类,均是跟文件操作有关的,分别是CFileDataIO类和CFile类。其中,前者是基类,后者由它派生而出的。具体的继承关系,可以参考这张图:

我们先来看CFileDataIO,代码中对它有这样一段注释,Maxiee粗略地翻译了一下:

这个类提供了安全的文件IO接口。
基本的IO操作的结果只有两种,成功或者抛出异常,因此失败是不能忽略的。现在有三种失败类型,读超过EOF、读时出错和写是出错。
在基本的IO操作之上,接口还提供几个函数,用来读写一些简单的数据类型,都采用小端模式,允许跨平台通信。

说到文件操作,我们首先最关注的是open,read,write,seek,flush这些基本操作,但是CFileDataIO没有open,flush,只有这几个函数:

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类的更多相关文章

  1. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  2. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  3. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

  4. 常用Java静态代码分析工具的分析与比较

    给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...

  5. cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)

    今天我们要讲三个类,这三个类应该算比較简单的 HelpLayer类 NumberLayer类 GetLocalScore类 HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示 ...

  6. stout代码分析之四:Try类

    stout的在异常捕获上遵循于谷歌类似的原则,不适用try...catch...,而是从函数返回值判断异常.Try类正是实现了这样的一个功能. 同Option一样,Try是一个模板类,每个类对象都有两 ...

  7. 阅读代码分析工具Understand 2.0试用

    Understand 2.0是一款源码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实能够大大提高代码阅读效率. 因为Understand功能十分强大,本文不可能详尽地介绍它的全部功能,所 ...

  8. C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...

  9. VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...

随机推荐

  1. C#压缩与解压

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  2. inode结构体成员详解

    概述:inode译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间.档名.使用者及群组等.inode分为内存中的inode和文件系统中的inode,为了避免混淆,我们称前者为VFS ino ...

  3. 从svn下载项目后build path为灰色

    今天从svn上下载项目后,想加入下面jar包.可是build path为灰色. 解决的方法是:1.在项目上右键properties---project facts 如图所看到的: 点击右側conver ...

  4. Go语言 关于go error处理风格的一些讨论和个人观点(上)

    原创文章.转载请注明出处:server非业余研究-sunface 近期看谷歌go group里面有非常多讨论go error处理风格的问题,颇有启示.如今跟大家分享一下.首先请看一个提问: Hi fo ...

  5. C++学习之路—运算符重载(一)概念、方法及规则

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 1    什么是运算符重载 先来说下什么是重载吧 ...

  6. JS - 侧边导航收缩伸展

    下载地址:http://www.lanrentuku.com/js/daohang-1162.html

  7. QT源码分析(从QApplication开始)

    QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...

  8. BCB/Delphi中常用的VCL函数说明(字符串函数)

    本文档是ccrun(老妖)根据网上资料整理而成. --------------------内存分配--------------------函数名称:AllocMem函数说明:在队中分配指定字节的内存块 ...

  9. OCA读书笔记(4) - 管理数据库实例

    Objectives: •Start and stop the Oracle database and components •Use Oracle Enterprise Manager •Acces ...

  10. Linux内核参数信息(Oracle相关)

    命令行:vim  /etc/sysctl.conf 查看如下两行的设置值,这里是: kernel.shmall = 2097152 kernel.shmmax = 4294967295 如果系统默认的 ...