IDirectWriterLock - 複合檔案實作

IDirectWriterLock的複合檔案實作可讓您使用單一寫入器和多個讀取器,以直接模式開啟複合檔案。

複合檔案可以使用 STGM_DIRECT 旗標,以直接模式開啟。 IDirectWriterLock介面會設定STGM_READWRITE|在直接模式中STGM_SHARE_DENY_WRITE旗標為有效,而不需要快照集複本的額外負荷。

使用 STGM_TRANSACTED 旗標在交易模式中開啟複合檔案時,您也可以使用 STGM_READWRITE 擁有多個讀取器和單一寫入器|STGM_SHARE_DENY_WRITE旗標。 不過,在此情況下,會針對讀取器建立檔案的快照集複本。 暫存複本通常會產生額外負荷。

使用時機

當您以直接模式開啟儲存體時,請使用 IDirectWriterLock 的系統提供實作, (STGM_DIRECT) 搭配 STGM_READWRITE|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。 這兩個進程都有寫入存取權,而且同步處理是由內部複合檔案實作所控制。

IDirectWriterLock