RDT_ReadLock 使用方式
_VSRDTFLAGS.RDT_ReadLock 是一個旗標,提供在執行中的文件資料表 (RDT) 中鎖定文件的邏輯,RDT 是目前在 Visual Studio IDE 中開啟的所有文件清單。 此旗標會決定何時開啟文件,以及文件是否顯示在使用者介面中,或隱藏在記憶體中。
一般來說,當以下情況之一為真時,您可以使用 _VSRDTFLAGS.RDT_ReadLock:
您希望以唯讀方式隱形開啟文件,但尚未確定哪個 IVsHierarchy 應擁有該文件。
您希望在 UI 中顯示已隱形開啟的文件並嘗試關閉該文件之前,提示使用者儲存該文件。
如何管理明顯和隱藏的文件
當使用者在 UI 中開啟文件時,必須為文件建立 IVsHierarchy 負責人,並設定 _VSRDTFLAGS.RDT_EditLock 旗標。 如果無法建立 IVsHierarchy 負責人,那麼當使用者按一下 [全部儲存] 或關閉 IDE 時,將不會儲存文件。 這表示如果在記憶體中修改的文件是隱形開啟的,而在關機或已選擇 [全部儲存] 時提醒使用者儲存文件,則不能使用 RDT_ReadLock
。 相反地,必須使用 RDT_EditLock
,並在 __VSREGDOCLOCKHOLDER.RDLH_WeakLockHolder旗標時註冊 IVsDocumentLockHolder。
RDT_EditLock 和文件修改
前面提到的旗標表示,當使用者將文件開啟為明顯的 DocumentWindow 時,隱形開啟的文件將產生其 RDT_EditLock
。 發生這種情況時,當關閉明顯的 DocumentWindow 時,使用者會看到 [儲存] 提示。 使用 IVsInvisibleEditorManager 服務的 Microsoft.VisualStudio.Package.Automation.OAProject.CodeModel
實作最初在只使用 RDT_ReadLock
時起作用 (即當文件以隱形方式開啟以剖析資訊時)。 之後,如果必須修改文件,則鎖定會升級為弱 RDT_EditLock。 如果使用者隨後在明顯的 DocumentWindow 中開啟文件,則會釋放 CodeModel
的弱 RDT_EditLock
。
如果使用者接者關閉 DocumentWindow 並在提示儲存開啟的文件時選擇 [否],那麼 CodeModel
實作將處置文件中的所有資訊,並在下次需要更多文件資訊時,從磁碟隱形地重新開啟文件。 這種行為的精妙之處在於,使用者開啟以隱形方式開啟文件的 DocumentWindow 並加以修改、關閉,然後在系統提示儲存文件時選擇 [否]。 在此情況下,如果文件有 RDT_ReadLock
,那麼即使使用者選擇不儲存文件,文件實際上也不會關閉,修改後的文件將在記憶體中保持隱形開啟狀態。
如果文件的隱形開啟使用的是弱 RDT_EditLock
,那麼當使用者以明顯方式開啟文件且沒有其他鎖定,它就會產生鎖定。 當使用者關閉 DocumentWindow,並在系統提示儲存文件時選擇 [否] 時,則必須從記憶體中關閉該文件。 這表示隱形用戶端必須聆聽 RDT 事件才能追蹤此事件的發生。 下次需要文件時,必須重新開啟文件。