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 成功,則物件無法共用,而且在關閉控制碼之前無法再次開啟。 如需詳細資訊,請參閱本主題的一節。

共用選項會維持有效狀態,直到您關閉物件的控制碼為止。

若要讓進程在另一個進程開啟物件時共用物件,請使用下列一或多個值的組合來指定可以要求開啟物件的存取模式。

意義
FILE_SHARE_DELETE
0x00000004
啟用物件上後續開啟的作業,以要求刪除存取權。

否則,如果其他進程要求刪除存取權,則無法開啟物件。

如果未指定此旗標,但物件已開啟以供刪除存取,則函式會失敗。

FILE_SHARE_READ
0x00000001
啟用物件上的後續開啟作業,以要求讀取權限。

否則,如果其他進程要求讀取權限,則無法開啟物件。

如果未指定此旗標,但物件已開啟以供讀取存取,則函式會失敗。

FILE_SHARE_WRITE
0x00000002
啟用物件上的後續開啟作業,以要求寫入存取權。

否則,如果進程要求寫入權限,則無法開啟物件。

如果未指定此旗標,但物件已開啟以供寫入存取,或具有具有寫入權限的檔案對應,則函式會失敗。

[in, optional] lpSecurityAttributes

保留的。

[in] dwFlagsAndAttributes

檔案旗標。

OpenFileById 開啟檔案時,它會結合檔案旗標與現有的檔案屬性,並忽略任何提供的檔案屬性。 此參數可以包含下列旗標的任何組合。

意義
FILE_FLAG_BACKUP_SEMANTICS
0x02000000
正在開啟備份或還原作業的檔案。 當進程具有 SE_BACKUP_NAMESE_RESTORE_NAME 許可權時,系統可確保呼叫進程會覆寫檔案安全性檢查。 如需詳細資訊,請參閱 變更權杖中的許可權

您必須設定此旗標,才能取得目錄的控制碼。 目錄控制碼可以傳遞至某些函式,而不是檔案控制代碼。 如需詳細資訊,請參閱 目錄控制碼

FILE_FLAG_NO_BUFFERING
0x20000000
系統會開啟沒有系統快取的檔案。 此旗標不會影響硬碟快取。 與 FILE_FLAG_OVERLAPPED結合時,旗標會提供最大的非同步效能,因為 I/O 不會依賴記憶體管理員的同步作業。 不過,某些 I/O 作業需要更多時間,因為資料不會保留在快取中。 此外,仍可快取檔案中繼資料。 若要將中繼資料排清到磁片,請使用 FlushFileBuffers 函 式。

使用 以 FILE_FLAG_NO_BUFFERING開啟的檔案時,應用程式必須符合特定需求:

  • 檔案存取必須從磁片區磁區大小的整數倍數的檔案內的位元組位移開始。
  • 檔案存取必須是整數磁片區大小倍數的位元組數目。 例如,如果磁區大小為 512 個位元組,應用程式可以要求讀取和寫入 512、1024、1536 或 2048 個位元組,但不能要求 335、981 或 7171 個位元組。
  • 讀取和寫入作業的緩衝區位址應對齊磁區,這表示在磁片區磁區大小的整數倍數記憶體中的位址上對齊。 視磁片而定,可能不會強制執行此需求。
在磁片區磁區大小的整數倍數上對齊緩衝區的方法之一,就是使用 VirtualAlloc 來配置緩衝區。 它會在作業系統記憶體頁面大小的整數倍數的位址上配置對齊的記憶體。 因為記憶體頁面和磁片區磁區大小都是 2 的威力,所以此記憶體也會對齊磁片區大小整數倍數的位址。 記憶體分頁的大小為 4-8 KB;磁區是 512 個位元組 (硬碟) 或 2048 個位元組 (CD) ,因此磁片區磁區永遠不能大於記憶體分頁。

應用程式可以藉由呼叫 GetDiskFreeSpace 函式來判斷磁片區磁區大小。

FILE_FLAG_OPEN_NO_RECALL
0x00100000
要求檔案資料,但應該繼續位於遠端儲存體中。 它不應該傳輸回本機儲存體。 此旗標可供遠端儲存系統使用。
FILE_FLAG_OPEN_REPARSE_POINT
0x00200000
使用此旗標時,不會發生一般 重新分析點 處理,而 OpenFileById 會嘗試開啟重新分析點。 開啟檔案時,會傳回檔案控制代碼,不論控制重新分析點的篩選是否正常運作。 這個旗標不能與 CREATE_ALWAYS 旗標搭配使用。 如果檔案不是重新分析點,則會忽略此旗標。
FILE_FLAG_OVERLAPPED
0x40000000
開啟或建立這個檔案是為了非同步 I/O。 當作業完成時, 重迭 結構中呼叫所指定的事件會設定為已發出訊號的狀態。 需要大量時間來處理傳回 ERROR_IO_PENDING的作業。

如果指定此旗標,檔案可用於同時讀取和寫入作業。 系統不會維護檔案指標,因此您必須將檔案位置傳遞至 OVERLAPPED 結構中的讀取和寫入函式,或更新檔案指標。

如果未指定此旗標,則即使讀取和寫入函式的呼叫指定 了 OVERLAPPED 結構,I/O 作業也會序列化。

FILE_FLAG_RANDOM_ACCESS
0x10000000
隨機存取檔案。 系統可使用這個做為最佳化檔案快取的提示。
FILE_FLAG_SEQUENTIAL_SCAN
0x08000000
按順序從開頭至結尾存取檔案。 系統可使用這個做為最佳化檔案快取的提示。 如果應用程式移動檔案指標以進行隨機存取,則可能不會發生最佳快取。 不過,仍保證正確的作業。

指定此旗標可提高使用循序存取讀取大型檔案之應用程式的效能。 對於大部分依序讀取大型檔案的應用程式,效能提升可能更明顯,但偶爾會略過少量的位元組範圍。

FILE_FLAG_WRITE_THROUGH
0x80000000
系統會透過任何中繼快取寫入,並直接移至磁片。

如果未同時指定 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。

另請參閱

ACCESS_MASK

CloseHandle

CreateFile

DeleteFile

FILE_ID_DESCRIPTOR

檔案管理功能

GetFileInformationByHandleEx

GetOverlappedResult

重疊

OpenFile

ReadFile

WriteFile