aMule代碼分析(2)——CFileDataIO類和CFile類

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,相信我們就有所瞭解啦~
 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章