File類本身并不持有文件句柄,它只是集中了一系列對文件的操作方法,如Create,Open等等。這些方法全部都是靜態(tài)的,也不進(jìn)行任何的安全檢測,僅僅
是直接調(diào)用pspsdk來完成任務(wù),如果出現(xiàn)錯(cuò)誤,則返回負(fù)值。
File的Open等方法可以創(chuàng)建針對指定文件讀寫的流對象FileStream,句柄由FileStream自己創(chuàng)建和持有管理,F(xiàn)ile::Open只是傳達(dá)路徑信息。
可以把File看作是一個(gè)門面,集中了對文件的所有操作,并且不需要?jiǎng)?chuàng)建File對象就可以直接執(zhí)行這些操作。所以說File為文件的單一操作提供了快捷簡便的方式。
除了幾個(gè)創(chuàng)建FileStream流的操作外,其他操作都不會(huì)長期占用句柄資源,遵循"句柄創(chuàng)建-執(zhí)行具體操作-釋放句柄"的步驟。
如果需要頻繁的操作文件,則需要一個(gè)類來長期持有句柄,避免經(jīng)常性的打開和關(guān)閉文件,故此引入FileInfo類。FileInfo執(zhí)行Append等操作時(shí),都是使用事先打開的文件句柄。
同時(shí),F(xiàn)ileInfo也可以創(chuàng)建FileStream實(shí)例,但這個(gè)時(shí)候,文件的句柄生命周期應(yīng)該由FileInfo來管理,F(xiàn)ileStream可以使用這個(gè)句柄,但不能結(jié)束其生命周期,F(xiàn)ileStream::Close()方法僅僅使這個(gè)流處于關(guān)閉(不可讀寫)狀態(tài),但并不實(shí)際關(guān)閉文件句柄。
這種情況下,F(xiàn)ileInfo所創(chuàng)建的FileStream::Close()的行為和前面File所創(chuàng)建的FileStream::Close()行為有差異。因?yàn)镕ile并不持有句柄,所以它創(chuàng)建了FileStream對象后,句柄應(yīng)該由FileStream來管理。但FileInfo所創(chuàng)建的FileStream是使用的FileInfo所創(chuàng)建好的句柄,所以它并不對此句柄負(fù)責(zé)。
實(shí)現(xiàn)策略:
1.使用基于繼承的多態(tài)或基于模板的靜多態(tài)。
2.使用函數(shù)回調(diào)。把Close做成調(diào)用函數(shù)指針,通過不同的FileStream構(gòu)造函數(shù)調(diào)用,來設(shè)置指針指向不同的Close函數(shù)實(shí)現(xiàn)。(關(guān)閉句柄或不關(guān)閉句柄)
這兩種做法的優(yōu)劣性正在考證中,請?zhí)岢鲆庖姟?
補(bǔ)充:File和FileInfo的關(guān)系在dotnet中也有體現(xiàn),不過他們主要是從錯(cuò)誤檢測方面考慮。
最終的目的是要為客戶提供一個(gè)統(tǒng)一的界面,所以不能用太復(fù)雜的模板。
經(jīng)過慎重考慮,我還是決定用虛函數(shù),放棄了模板。