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模式