IDirectWriterLock - 複合檔案實作
IDirectWriterLock 的複合檔案實作,可讓您使用單一寫入器和多個讀取器,以直接模式開啟複合檔案。
複合檔案可以使用 STGM_DIRECT 旗標以直接模式開啟。 IDirectWriterLock 介面會設定STGM_READWRITE|STGM_SHARE_DENY_WRITE直接模式中有效的旗標,而不需要快照集復本的額外負荷。
使用 STGM_TRANSACTED 旗標以交易模式開啟複合檔案時,您也可以使用 STGM_READWRITE 來擁有多個讀取器和單一寫入器|STGM_SHARE_DENY_WRITE旗標。 不過,在此情況下,會為讀取器建立檔案的快照集複本。 臨時復本通常會有額外負荷。
使用時機
當您使用 STGM_READWRITE 以直接模式開啟記憶體 STGM_DIRECT時,請使用 IDirectWriterLock 的系統提供實作|STGM_SHARE_DENY_WRITE旗標。
若要取得 IDirectWriterLock指標,請在 IStorage 上呼叫 QueryInterface,以取得複合檔案的根記憶體物件。
呼叫 IDirectWriterLock::WaitForWriteAccess,以取得複合檔案的獨佔寫入許可權。 呼叫 IDirectWriterLock::ReleaseWriteAccess,以釋放獨佔寫入存取權。
IDirectWriterLock::HaveWriteAccess 指出檔案目前是否已鎖定。
言論
單一寫入器、多讀取器功能的複合檔案實作是以範圍鎖定為基礎。 寫入器會取得記憶體的獨佔存取權,以在所有目前的讀取器關閉記憶體之後寫入。 寫入器處於使用中狀態時,後續讀取器無法開啟記憶體。 寫入器會呼叫 IDirectWriterLock::WaitForWriteAccess,以取得獨佔寫入存取權。 然後,寫入器必須呼叫 IDirectWriterLock::ReleaseWriteAccess 來釋放記憶體。
需要呼叫 IDirectWriterLock::WaitForWriteAccess,才能以這個單一讀取器、多寫入器模式撰寫。 嘗試寫入檔案,而不呼叫 IDirectWriterLock::WaitForWriteAccess 第一個結果STG_E_ACCESSDENIED。 即使寫入器一開始開啟檔案,而且目前沒有讀取器開啟檔案,也會傳回此錯誤。
封送處理考慮
當複合檔案封送處理至相同計算機上的另一個進程時,通常會使用自定義封送處理。 封送處理記憶體時,不會考慮訪問許可權,而且會將 IStorage 指標傳遞至與原始封送處理程式相同的存取模式和許可權的新進程。 如需存取模式的詳細資訊,請參閱 STGM 常數。 封送處理期間,不會進行鎖定或驗證,以確保獨佔寫入存取權。 在此情況下,對於在單一寫入器、多讀取器模式中開啟的複合檔案,不會強制執行單一寫入器原則。 相反地,複合檔案實作會在內部處理強制執行。
因為 IStorage 指標會在封送處理期間傳遞至另一個進程,所以兩個進程可以同時存取相同的複合檔案。 即使呼叫端可能已透過呼叫 IDirectWriterLock::WaitForWriteAccess取得記憶體的獨佔寫入許可權,封送處理版本也可以同時存取。 當單一寫入器存取檔案時,封送處理的版本不會強制關閉。 在此情況下,複合檔案實作會在內部同步寫入。
如果單一寫入器藉由呼叫 來取得獨佔存取權,IDirectWriterLock::WaitForWriteAccess,封送處理記憶體也具有寫入許可權,而且不需要呼叫 IDirectWriterLock::WaitForWriteAccess。 這兩個進程都有寫入存取權,而且同步處理是由內部複合檔案實作所控制。
相關主題