winbase.h (OpenFileById 函式)
開啟符合指定識別碼的檔案。
語法
HANDLE OpenFileById(
[in] HANDLE hVolumeHint,
[in] LPFILE_ID_DESCRIPTOR lpFileId,
[in] DWORD dwDesiredAccess,
[in] DWORD dwShareMode,
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
[in] DWORD dwFlagsAndAttributes
);
參數
[in] hVolumeHint
儲存要開啟之檔案之磁片區或共用上任何檔案的控制碼。
[in] lpFileId
識別要開啟之檔案 的FILE_ID_DESCRIPTOR 指標。
[in] dwDesiredAccess
物件的存取權。 存取可以是讀取、寫入或兩者。
如需詳細資訊,請參閱 檔案安全性和存取權限。 您無法要求存取模式,該模式與開啟要求中指定的共用模式發生衝突,該模式是在具有開啟控制碼的開啟要求中指定。
如果此參數為零 (0) ,則應用程式可以在不存取裝置的情況下查詢檔案和裝置屬性。 這適用于應用程式,以判斷磁片磁碟機的大小及其支援的格式,而不需要磁片磁碟機中的磁片磁碟機。 它也可以用來測試檔案或目錄是否存在,而不需開啟檔案或目錄以進行讀取或寫入存取。
[in] dwShareMode
物件的共用模式,可以是讀取、寫入、兩者或無。
您無法要求與開啟控制碼之開啟要求中指定的存取模式衝突的共用模式,因為這會導致下列共用違規: (ERROR_SHARING_VIOLATION) 。 如需詳細資訊,請參閱 建立和開啟檔案。
如果此參數為零 (0) 且 OpenFileById 成功,則物件無法共用,而且在關閉控制碼之前無法再次開啟。 如需詳細資訊,請參閱本主題的一節。
共用選項會維持有效狀態,直到您關閉物件的控制碼為止。
若要讓進程在另一個進程開啟物件時共用物件,請使用下列一或多個值的組合來指定可以要求開啟物件的存取模式。
[in, optional] lpSecurityAttributes
保留的。
[in] dwFlagsAndAttributes
檔案旗標。
當 OpenFileById 開啟檔案時,它會結合檔案旗標與現有的檔案屬性,並忽略任何提供的檔案屬性。 此參數可以包含下列旗標的任何組合。
值 | 意義 |
---|---|
|
正在開啟備份或還原作業的檔案。 當進程具有 SE_BACKUP_NAME 和 SE_RESTORE_NAME 許可權時,系統可確保呼叫進程會覆寫檔案安全性檢查。 如需詳細資訊,請參閱 變更權杖中的許可權。
您必須設定此旗標,才能取得目錄的控制碼。 目錄控制碼可以傳遞至某些函式,而不是檔案控制代碼。 如需詳細資訊,請參閱 目錄控制碼。 |
|
系統會開啟沒有系統快取的檔案。 此旗標不會影響硬碟快取。 與 FILE_FLAG_OVERLAPPED結合時,旗標會提供最大的非同步效能,因為 I/O 不會依賴記憶體管理員的同步作業。 不過,某些 I/O 作業需要更多時間,因為資料不會保留在快取中。 此外,仍可快取檔案中繼資料。 若要將中繼資料排清到磁片,請使用 FlushFileBuffers 函 式。
使用 以 FILE_FLAG_NO_BUFFERING開啟的檔案時,應用程式必須符合特定需求:
應用程式可以藉由呼叫 GetDiskFreeSpace 函式來判斷磁片區磁區大小。 |
|
要求檔案資料,但應該繼續位於遠端儲存體中。 它不應該傳輸回本機儲存體。 此旗標可供遠端儲存系統使用。 |
|
使用此旗標時,不會發生一般 重新分析點 處理,而 OpenFileById 會嘗試開啟重新分析點。 開啟檔案時,會傳回檔案控制代碼,不論控制重新分析點的篩選是否正常運作。 這個旗標不能與 CREATE_ALWAYS 旗標搭配使用。 如果檔案不是重新分析點,則會忽略此旗標。 |
|
開啟或建立這個檔案是為了非同步 I/O。 當作業完成時, 重迭 結構中呼叫所指定的事件會設定為已發出訊號的狀態。 需要大量時間來處理傳回 ERROR_IO_PENDING的作業。
如果指定此旗標,檔案可用於同時讀取和寫入作業。 系統不會維護檔案指標,因此您必須將檔案位置傳遞至 OVERLAPPED 結構中的讀取和寫入函式,或更新檔案指標。 如果未指定此旗標,則即使讀取和寫入函式的呼叫指定 了 OVERLAPPED 結構,I/O 作業也會序列化。 |
|
隨機存取檔案。 系統可使用這個做為最佳化檔案快取的提示。 |
|
按順序從開頭至結尾存取檔案。 系統可使用這個做為最佳化檔案快取的提示。 如果應用程式移動檔案指標以進行隨機存取,則可能不會發生最佳快取。 不過,仍保證正確的作業。
指定此旗標可提高使用循序存取讀取大型檔案之應用程式的效能。 對於大部分依序讀取大型檔案的應用程式,效能提升可能更明顯,但偶爾會略過少量的位元組範圍。 |
|
系統會透過任何中繼快取寫入,並直接移至磁片。
如果未同時指定 FILE_FLAG_NO_BUFFERING ,讓系統快取生效,則資料會寫入系統快取,但會排清到磁片,而不會延遲。 如果也指定 了FILE_FLAG_NO_BUFFERING ,因此系統快取不會生效,則資料會立即排清到磁片,而不會通過系統快取。 作業系統也會要求寫入硬碟快取至永續性媒體。 不過,並非所有硬體都支援此寫入功能。 |
傳回值
如果此函數成功,傳回值就是指定之檔案的開啟控制代碼。
如果函式失敗,傳回值 會INVALID_HANDLE_VALUE。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
備註
使用 CloseHandle 函式關閉 OpenFileById 傳回的物件控制碼。
如果您在先前呼叫DeleteFile時擱置刪除的檔案上呼叫OpenFileById,則函式會失敗。 作業系統會延遲檔案刪除,直到檔案的所有控制碼都關閉為止。 GetLastError 會傳回 ERROR_ACCESS_DENIED。
在 Windows 8 和 Windows Server 2012 中,下列技術支援此函式。
技術 | 支援 |
---|---|
伺服器訊息區 (SMB) 3.0 通訊協定 | 否 |
SMB 3.0 透明容錯移轉 (TFO) | 否 |
具有向外延展檔案共用的 SMB 3.0 (SO) | 否 |
叢集共用磁片區檔案系統 (CsvFS) | Yes |
彈性檔案系統 (ReFS) | 是 |
規格需求
最低支援的用戶端 | Windows Vista [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2008 [僅限傳統型應用程式] |
目標平台 | Windows |
標頭 | winbase.h (包含 Windows.h) |
程式庫 | Kernel32.lib;Windows Server 2003 和 Windows XP 上的 FileExtd.lib |
DLL | Kernel32.dll |
可轉散發套件 | Windows Server 2003 和 Windows XP 上的 Windows SDK。 |