執行中的文件資料表
IDE 會維護內部結構中所有目前開啟的檔案清單,稱為執行中的文件數據表 (RDT)。 此清單包含記憶體中所有開啟的檔,不論這些檔目前是否正在編輯。 檔是保存的任何專案,包括專案或主要項目檔中的檔案(例如 .vcxproj 檔案)。
執行中文件數據表的專案
執行中的檔案表格包含下列專案。
元素 | 描述 |
---|---|
檔Moniker | 可唯一識別文件數據物件的字串。 這是管理檔案的項目系統絕對檔案路徑(例如 C:\MyProject\MyFile)。 此字串也用於儲存在文件系統以外的存放區中的專案,例如資料庫中的預存程式。 在此情況下,專案系統可以發明可辨識且可能剖析的唯一字串,以判斷如何儲存檔。 |
階層擁有者 | 擁有檔的hierarchy物件,如介面所 IVsHierarchy 表示。 |
項目識別碼 | 階層內特定專案的專案標識碼。 這個值在擁有此檔的所有階層中是唯一的,但這個值不保證在不同階層中是唯一的。 |
檔資料物件 | 至少,這是 IUnknown 物件。 IDE 不需要自定義編輯器的檔數據物件介面以外的 IUnknown 任何特定介面。 不過,對於標準編輯器,需要編輯器的 介面實作 IVsPersistDocData2 ,才能處理來自專案的檔案持續性呼叫。 如需詳細資訊,請參閱 儲存標準檔。 |
旗標 | 旗標,控制是否儲存檔、是否套用讀取或編輯鎖定等等,可以在專案新增至 RDT 時指定。 如需詳細資訊,請參閱 _VSRDTFLAGS 列舉。 |
編輯鎖定計數 | 編輯鎖定計數。 編輯鎖定表示某些編輯器已開啟檔以供編輯。 當編輯鎖定計數轉換為零時,如果檔已修改,系統會提示使用者儲存檔。 例如,每次使用 [新增視窗] 命令在編輯器中開啟檔時,RDT 中就會新增該文件的編輯鎖定。 若要設定編輯鎖定,文件必須具有階層或專案標識碼。 |
讀取鎖定計數 | 讀取鎖定計數。 讀取鎖定表示檔正透過某些機制讀取,例如精靈。 讀取鎖定會在 RDT 中儲存檔,同時指出無法編輯檔。 即使文件沒有階層或項目標識碼,您也可以設定讀取鎖定。 此功能可讓您在記憶體中開啟檔,並在 RDT 中輸入檔,而不需要任何階層所擁有的檔。 此功能很少使用。 |
鎖定持有者 | 介面的 IVsDocumentLockHolder 實例。 鎖定持有者是由編輯器外部開啟和編輯檔的精靈等功能所實作。 鎖定持有者可讓功能將編輯鎖定新增至檔,以防止檔在編輯時關閉檔。 通常,編輯鎖定只會由文檔視窗新增(也就是編輯器)。 |
RDT 中的每個專案都有與其相關聯的唯一階層或專案標識碼,通常會對應至專案中的一個節點。 所有可供編輯的檔通常都由階層所擁有。 在 RDT 控制項中建立的專案,或更準確地控制哪些階層,目前擁有正在編輯的文件資料物件。 使用 RDT 中的資訊,IDE 可以防止檔一次由多個項目開啟。
階層也會控制數據的持續性,並使用 RDT 中的資訊來更新 [另存新檔] 對話方塊。 當使用者修改檔,然後從 [檔案] 功能表選擇 [結束] 命令時,IDE 會提示他們顯示 [儲存變更] 對話方塊,以顯示目前修改的所有專案和項目專案。 這可讓使用者選擇要儲存的檔。 要儲存的檔案清單(也就是有變更的檔)是從 RDT 產生的。 您預期在 結束應用程式時,在 [儲存變更 ] 對話方塊中看到的任何項目都應該有 RDT 中的記錄。 RDT 會協調要儲存的檔,以及使用者是否使用每個檔的 Flags 專案中指定的值來提示使用者進行儲存作業。 如需 RDT 旗標的詳細資訊,請參閱 _VSRDTFLAGS 列舉。
編輯鎖定和讀取鎖定
編輯鎖定和讀取鎖定位於 RDT 中。 文件視窗會遞增並遞減編輯鎖定。 因此,當用戶開啟新的文件視窗時,編輯鎖定計數會遞增一個。 當編輯鎖定數目達到零時,階層會發出訊號來保存或儲存相關聯文件的數據。 然後階層就可以以任何方式保存數據,包括以檔案的形式保存或儲存機制中的專案。 您可以使用 LockDocument 介面中的 IVsRunningDocumentTable 方法來新增編輯鎖定和讀取鎖定,以及 UnlockDocument 移除這些鎖定的方法。
一般而言,當編輯器的文件視窗具現化時,視窗框架會自動在 RDT 中新增檔的編輯鎖定。 不過,如果您建立不使用標準文檔視窗的檔自定義檢視(也就是說,它不會實 IVsWindowFrame 作 介面),則需要設定自己的編輯鎖定。 例如,在精靈中,會編輯檔,而不需在編輯器中開啟。 為了讓精靈和類似實體開啟檔鎖定,這些實體必須實作 IVsDocumentLockHolder 介面。 若要註冊您的文件鎖定持有者,請呼叫 RegisterDocumentLockHolder 方法,並傳入您的 IVsDocumentLockHolder 實作。 這麼做會將文件鎖定持有者新增至 RDT。 另一個實作文件鎖定持有者的案例是,如果您透過特殊工具窗口開啟檔。 在此實例中,您無法讓工具視窗關閉檔。 不過,在 RDT 中註冊為文件鎖定持有者,IDE 可以呼叫 方法的實作 CloseDocumentHolder ,以提示關閉檔。
執行中文件數據表的其他用法
IDE 中的其他實體會使用 RDT 來取得文件的相關信息。 例如,原始檔控制管理員會在取得最新版本的檔案之後,使用 RDT 告訴系統在編輯器中重載檔。 若要這樣做,原始檔控制管理員會查閱 RDT 中的檔案,以查看其中是否有任何檔案已開啟。 如果是,則原始檔控制管理員會先檢查階層是否實作 ReloadItem 方法。 如果專案未實 ReloadItem 作 方法,則原始檔控制管理員會直接檢查文件數據物件上方法的 ReloadDocData 實作。
如果使用者要求該檔,IDE 也會使用 RDT 來重新浮出表面(帶至正面)開啟的檔。 如需詳細資訊,請參閱 使用 Open File 命令顯示檔案。 若要判斷 RDT 中是否開啟檔案,請執行下列其中一項動作。
查詢檔Moniker (也就是完整文件路徑),以找出專案是否開啟。
使用階層或專案標識碼來詢問項目系統的完整文件路徑,然後在 RDT 中查閱專案。