IShellFolder基礎概念介紹

2021-06-08 06:56:58 字數 2896 閱讀 3918

shell即是外殼,shell的基礎是桌面,桌面之下衍生出很多子資料夾,以及系統的「網路」、「控制面板」、「c:/」等資料夾,這些資料夾裡又有很多層子資料夾。這裡需要用到幾個介面和結構體:

可以以這樣的樹狀結構來看上述概念:

每個實際的資料夾對應乙個ishellfolder,每個ishellfolder可以獲得乙個enumidlist,遍歷每個enumidlist可以獲得每個itemidlist,每個itemidlist就已經與檔案一一對應。

windows中的目錄可以理解為是乙個樹型結構,樹的根是「桌面」,「桌面」中一般擁有「我的電腦」、「網路上的芳鄰」、「**站」等資料夾。這個我們稱它為命名空間。物理上呢,「桌面」一般位於「c:/documents and settings/使用者名稱/桌面」。

ishellfolder介面用於管理資料夾,所有shell命名空間中的資料夾物件都暴露這個介面。我們可以通過shgetdesktopfolder方法獲得「桌面」的ishellfolder介面。當然,最後不使用的時候要呼叫ishellfolder的release方法釋放介面。

通過呼叫「桌面」的ishellfolder介面的enumobjects方法獲得ienumidlist介面的指標。ienumidlist介面用於遍歷ishellfolder介面表示的資料夾下的所有物件(這裡的物件是指檔案或者資料夾)。通過ienumidlist介面可以遍歷子物件的itemidlist陣列。itemidlist陣列表示乙個物件的絕對或者相對路徑。當前可以將itemidlist陣列理解為給shell使用的,代替我們常用的「windows/system32」這樣的路徑表示形式。而這裡通過ienumidlist介面遍歷獲得的ienumidlist陣列是乙個相對路徑,相對於當前ishellfolder的路徑。呼叫ishellfolder的bindtoobject方法,並傳遞ienumidlist陣列的相對路徑,可以獲得ienumidlist陣列表示的子資料夾的ishellfolder介面。這樣我們可以通過遞迴或者迴圈遍歷以「桌面」開始的整個邏輯目錄樹。

簡介下面詳細介紹一下上面提到的shell使用的路徑。shell管理的檔案和資料夾有儲存在磁碟上的,也有不儲存在磁碟上的,如「網路印表機」、「網路鄰居」、「控制面板」、「**站」等。這些不儲存在磁碟上的檔案或資料夾成為虛擬物件。像「網路印表機」這樣的虛擬物件,根本不需要儲存在磁碟上,它只儲存幾個網路印表機的鏈結。而像「**站」這樣的虛擬物件,它位於磁碟上,但需要進行與普通檔案或資料夾不同的操作。例如,虛擬物件可能在explorer中顯示的是兩個物件,但它們可能被儲存在同乙個磁碟檔案中。

在檔案系統的命名空間中,包含兩種物件:資料夾物件和檔案物件。資料夾物件是樹的節點,它包含檔案和子資料夾。檔案物件是樹的葉子,它可能是乙個磁碟檔案也可能是乙個虛擬物件。如果乙個資料夾不是檔案系統的一部分,它通常被稱為虛擬資料夾。

標識命名空間中的物件

在使用命名空間中的物件前,我們必須先標識它。由於在檔案系統中檔名是可以重複使用的,所以我們使用完整限定名(完整路徑),如:「c:/mydocs/myfile.htm」。但是這無法表示虛擬物件。所以shell使用一種替代的標識,這個標識能夠表示命名空間中所有的物件。

item ids

在乙個資料夾中,每乙個物件都有乙個item id,它等價於檔案或資料夾名稱的功能。item id實際上是乙個****emid結構:

typedef struct _****emid

****emid, * lp****emid;

其中abid成員是物件的識別符號。abid的長度沒有定義。它的值由包含它的資料夾來探測。abid的大小是可變的,所以cb成員儲存****emid結構的位元組數。

因為item id不是用於顯示,所以包含它的資料夾通常為它分配乙個「顯示名稱」。這個「顯示名稱」由windows explorer用來顯示乙個資料夾的內容。

item id 列表

item id很少單獨使用,它通常是item id列表中的一部分。item id 列表與系統路徑意義相同。但item id 列表不是乙個字串,而是乙個itemidlist結構,這個結構是一串行的item id(乙個或者多個),並由2個位元組的null表示結束。item id 列表中的每乙個item id 都對應命名空間中的乙個物件。它們的次序表示命名空間中的路徑,這很像檔案系統路徑。下面的圖表顯示了對應於「c:/mydocs/myfile.htm」的itemidlist的結構:

命名空間物件通常由itemidlist結構的指標來標識,或者指向乙個item id 列表的指標(pidl)。為了方便,以後使用pidl表示itemidlist結構,而不是item id 列表的指標。上面圖表顯示的pidl被稱為「全的」或「完整的」pidl。乙個全的pidl是由「桌面」開始,包含所有中間的路徑的item id。

全pidl不常被使用。很多函式和方法使用相對pidl。相對pidl的根是乙個資料夾,不是「桌面」。雖然它不是乙個物件的唯一識別符號,但是它要比全pidl短,並且對於某些應用來說它能夠充分說明該物件。

最常見的相對pidl是單層pidl,它相對於這個物件的父資料夾。它僅包含這個物件的item id以及null結束符。多層的pidl通常包含兩個或更多的item id,並且表示出了從父資料夾到這個物件的路徑,這個路徑中會包含中間的一些子資料夾。注意,單層pidl也可能是乙個全pidl(如「我的電腦」相對「桌面」的相對pidl)。特殊的,「桌面」物件是「桌面」的子資料夾。

分配pidl

雖然pidl與系統路徑很相似,但是它們還是有一些不同。主要的不同是如何分配和銷毀它們的記憶體。在應用中,通常是系統分配pidl使用的保持item id的記憶體,而使用者釋放它。

所以,我們必須使用imalloc介面來分配和釋放pidl。可以呼叫shgetmalloc來獲取imalloc介面指標,呼叫imalloc::alloc方法來分配記憶體,imalloc::free方法來釋放記憶體。最後呼叫imalloc::release釋放指標。

ELK(一) Elasticsearch基礎概念

elk提供了一整套解決方案,並且都是開源軟體,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用。目前主流的一種日誌系統。elk是三個開源軟體的縮寫,分別表示 elasticsearch logstash,kibana 它們都是開源軟體。新增了乙個filebeat,它是乙個輕量級的日誌收集處理工...

零基礎小白Python入門必看 程式設計基礎概念

每個物件由 標識 id 型別 type 值 value 組成 型別 相當於物件儲存的 資料 的型別。型別可以限制物件的取值範圍和可執行操作,使用type 123 獲取所屬型別。值 表示物件所儲存的資料的資訊。使用print 123 直接打在這裡插入 片印出值。用於變數 函式 類 模組等的名稱。a 1...

Hadoop 新生報道(三) hadoop基礎概念

一.namenode,seconderynamenode,datanode namenode,datanode,seconderynamenode都是程序,執行在節點上。1.namenode hadoop的主節點,儲存hdfs的元資料資訊 1.fsimage 它是在namenode啟動時對整個檔案系...