<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          dokan用戶態(tài)的文件系統(tǒng)驅(qū)動

          聯(lián)合創(chuàng)作 · 2023-10-01 04:21

          dokan是用戶態(tài)的文件系統(tǒng)驅(qū)動,可以稱之為fuse for windows??梢杂脕黹_發(fā)虛擬磁盤,即在“我的電腦”中虛擬出一個硬盤來,可以是硬盤,也可以是可移動磁盤或者網(wǎng)絡(luò)硬盤。

          CreateFile、FindFiles、GetFileInformation需要最優(yōu)先實現(xiàn),有了這兩個接口,就可以瀏覽目錄了。

          進入CreateFile,需要判斷請求的虛擬文件是目錄還是文件,如果是目錄,則需要設(shè)置 DokanFileInfo->IsDirectory為True,并直接返回成功。虛擬文件的打開可以根據(jù) CreationDisposition、AccessMode、ShareMode三者組合。最簡單的做法是在最開始處對做判斷,因為它只有五種可能 性,把文件不存在,但卻需要以只讀打開的都排除,然后就可以放心地應(yīng)用:讀使用”rb+”, 寫使用”wb+”。

          Create中返回的文件描述符或者類似的數(shù)據(jù)可以保存DokanFileInfo->context中,這個值可以在以后的其它函數(shù)調(diào)用中 訪問到:比如CloseFile, CleanUp, DeleteFile, ReadFile, WriteFile等等。

          CreateDirectory和實際的文件操作一致。
          OpenDirectory一般直接返回成功,除非目錄無訪問權(quán)限,可以人為地返回-1。
          CloseFile用處不大,因為在CloseFile之前,有一道CleanUp調(diào)用,已經(jīng)清除了打開的文件。
          CleanUp和CloseFile好像會被一前一后地調(diào)用,在CleanUp中需要做的事情是根據(jù)DokanFileInfo->context 保存的值關(guān)閉虛擬文件。并且DokanFileInfo->DeleteOnClose如果為True,則需要把當(dāng)前請求的文件或者目錄刪除。文件 刪除的動作實際是在Cleanup中實現(xiàn)的。

          DeleteDirectory和DeleteFile兩個接口實現(xiàn)中,不能夠真正去刪除文件,而是在文件或者目錄需要刪除時,返回0即可,系統(tǒng)會繼續(xù)調(diào)用上面說的cleanup來處理刪除事件。

          在文件的刪除時,有可能操作系統(tǒng)傳遞過來的請求文件并未被關(guān)閉,但好在同時DokanFileInfo->context也會被一同傳遞來,所以可以先強行關(guān)閉打開的文件,然后做刪除操作。

          操作系統(tǒng)的應(yīng)用程序每次讀寫文件都是通過ReadFile、WriteFile接口完成的,一般情況下一次求請的大小比較小,比如 65535Bytes等,但也有例外,比如使用FastCopy等多線程文件快速復(fù)制工具時,它會直接向ReadFile請求32MB的大小。

          ReadFile WriteFile一般情況下都會有DokanFileInfo->context參數(shù)傳進來,就像平常我們寫文件讀寫的代碼一樣,總是先 fopen個FILE*出來,然后再讀寫。 但是也有例外,比如記事本在讀文件的時候,就只是給個路徑+文件名。 這個時候,需要在ReadFile WriteFile臨時專門為這一次請求打開文件,在退出函數(shù)時,一定要關(guān)閉它。

          FlushFileBuffers是個沒用的東西,可以不實現(xiàn)。

          GetFileInformation非常重要,資源管理器每次打開目錄時,會查詢當(dāng)前目錄每個文件的信息。如果給出的信息不恰當(dāng),比如文件時間如 果是個變化的值(比如圖省事,將所以文件的時間設(shè)置為當(dāng)前時間),這樣會導(dǎo)致系統(tǒng)不斷地查詢,非常的恐怖。 在返回的dwFileAttributes中,需要小心地設(shè)置文件類型,文件和目錄千萬要區(qū)別正確。 試過FILE_ATTRIBUTE_NORMAL+FILE_ATTRIBUTE_ARCHIVE-FILE_ATTRIBUTE_ENCRYPTED以 及FILE_ATTRIBUTE_DIRECTORY就基本正常工作了,F(xiàn)ILE_ATTRIBUTE_ENCRYPTED一定要去掉,不然系統(tǒng)會認為你 虛擬出來的盤符是加密的,往其它盤復(fù)制文件時會提示不能處理加密文件而直接失敗。

          FindFiles函數(shù)中,我們需要用傳遞進來的函數(shù)指針FillFindData將我們需要顯示的目錄和文件填充到系統(tǒng)為我們準(zhǔn)備好的地方。只要 文件的屬性dwFileAttributes像樣,可以構(gòu)造虛擬文件和目錄(比如可以將數(shù)據(jù)庫里的用戶和組記錄讀出來,表示成一層層的目錄)。

          MoveFile就是移動文件及改名,沒什么特殊的地方。

          SetEndOfFile一般情況下使用不到,但是如果有軟件調(diào)用了這個API則還是有用的,比如像fastCopy,為了盡可能地加快復(fù)制速度, 它每次從內(nèi)存將固定大小的數(shù)據(jù)保存到硬盤,比如大小為31MB的文件,實際上它寫了32MB(文件尾部的數(shù)據(jù)其實是多余的),這是用readFile WriteFile實現(xiàn)的。但它最后會根據(jù)原文件的真實大小來做一次setEndOfFile將其裁剪到正確的大小。如果不實現(xiàn) setEndOfFile,fastcopy就沒用了。

          SetFileAttributes和SetFileTime如果不想實現(xiàn),就讓它返回0,最好不要為了禁用這兩個api.因為像Word之類的軟 件,它很在意這兩個函數(shù),在保存文件時候不厭其煩地調(diào)用,所以為了讓W(xué)ord在虛擬盤上工作正常,必須忽悠它,否則不能保存做過編輯的文檔。

          GetDiskFreeSpace是返回驅(qū)動器的容量信息的,比如虛擬盤可以做容量限制。
          GetVolumeInformation返回驅(qū)動器的卷標(biāo)和文件系統(tǒng)類型,可以隨便設(shè)置,文件類型可以隨便取名,比如“XX文件系統(tǒng)”,和NTFS/FAT32是同等地位的。

          GetFileInformation 有時候傳遞過來的DokanFileInfo->context不是空的,所以一定要使用它來查詢文件大小。 假設(shè)DokanFileInfo->context保存的是fopen打開的fd, 如果使用傳遞過來的文件名去GetFileAttribute或者Stat()真實文件,有可能會因為緩存的緣故查詢到的文件大小不是實時的。這一點在對 文件大小變化敏感的軟件上特別重要,比較變態(tài)的Word,在保存的時候,它會先保存到臨時文件,保存過程中,寫一點數(shù)據(jù),馬上查詢文件大小是否有變化是否 和寫的數(shù)據(jù)大小一致。如果這時GetFIleInformation馬馬虎虎地返回個大小,Word就罷工了,它會以為當(dāng)前磁盤是不穩(wěn)定的,或者容量比較 用光,而拒絕保存。

          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一区二区无码午夜久久久豆花av | 国产精品久久久久久精 | 日本逼逼网 | 在线看成人毛片 | 一级黄色在线 |