儲存標準文件
環境會處理 [儲存]、[另存新檔] 和 [全部儲存] 命令。 當使用者從 [檔案] 功能選取 [儲存]、[另存新檔] 或 [全部儲存] 或關閉方案時,會導致 [全部儲存],就會發生以下流程。
標準編輯器的 [儲存]、[另存新檔] 和 [全部儲存] 命令處理
以下步驟詳細說明此流程:
選取 [儲存] 和 [另存新檔] 命令時,環境會使用 SVsShellMonitorSelection 服務來判斷使用中的文件視窗,以及應該儲存哪些項目。 一旦知道使用中的文件視窗,環境就會在執行的文件資料表中尋找文件的階層指標和項目識別碼 (itemID)。 如需詳細資訊,請參閱執行文件資料表。
選取 [全部儲存] 命令時,環境會使用執行中的文件資料表內的資訊來編譯要儲存的所有項目清單。
當方案收到 QueryStatus 呼叫時,它會逐一查看一組選取的項目 (也就是 SVsShellMonitorSelection 服務公開的多個選取)。
在選取範圍中的每個項目上,方案會使用階層指標呼叫 IsItemDirty 方法來判斷是否 應該啟用 [儲存] 功能表命令。 如果一或多個專案已變更,則會啟用 [儲存] 命令。 如果階層使用標準編輯器,則階層會藉由呼叫 IsDocDataDirty 方法,將已變更狀態的查詢委派給編輯器。
在已變更的每個選取項目上,方案會使用階層指標在適當的階層上呼叫 SaveItem 方法。
階層通常會使用標準編輯器來編輯文件。 在這種情況下,該編輯器的文件資料物件應該支援 IVsPersistDocData2 介面。 在收到 SaveItem 方法呼叫時,專案應該透過在文件資料物件上呼叫 SaveDocData 方法,通知編輯器正在儲存文件。 編輯器可以藉由呼叫 SVsUIShell 介面的
Query Service
,允許環境處理 [另存新檔] 對話方塊。 這將傳回一個指向 IVsUIShell 介面的指標。 然後,編輯器必須呼叫 SaveDocDataToFile 方法,並透過pPersistFile
參數將指標傳遞至編輯器的 IPersistFileFormat 實作。 然後,環境執行「儲存」作業,並提供編輯器的 [另存新檔] 對話方塊。 環境接著使用 IPersistFileFormat 回呼編輯器。如果使用者嘗試儲存未命名的文件 (也就是先前未儲存的文件),則實際上會執行 [另存新檔] 命令。
對於 [另存新檔] 命令,環境會顯示 [另存新檔] 對話方塊,提示使用者輸入檔案名稱。
如果檔案的名稱已變更,則階層會負責透過呼叫 SetProperty (VSFPROPID_MkDocument) 來更新文件框架的快取資訊。
如果 [另存新檔] 命令移動文件的位置,而且階層對文件位置很敏感,則階層會負責將開啟文件視窗的所有權移交給另一個階層。 例如,如果專案追蹤檔案是與專案相關的內部或外部檔案 (其他檔案),就會發生這種情況。 使用下列程式,將檔案的所有權變更為「其他檔案」專案。
變更檔案所有權
將檔案所有權變更為「其他檔案」專案
SVsExternalFilesManager 介面的查詢服務。
傳回一個指向 IVsExternalFilesManager2 的指標。
呼叫 TransferDocument (
pszMkDocumentNew
、punkWindowFrame
) 方法,將文件傳輸到新的階層。 執行 [另存新檔] 命令的階層會呼叫此方法。