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