Share via


OpenFileById 함수(winbase.h)

지정된 식별자와 일치하는 파일을 엽니다.

구문

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_NAME 및SE_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~8KB입니다. 섹터는 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를 위해 파일을 열거나 만듭니다. 작업이 완료되면 OVERLAPPED 구조체의 호출에 지정된 이벤트가 신호 상태로 설정됩니다. 반환 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 프로토콜 No
SMB 3.0 TFO(투명 장애 조치(failover)) No
SO(스케일 아웃 파일 공유)를 사용하는 SMB 3.0 No
CsvFS(클러스터 공유 볼륨 파일 시스템)
ReFS(Resilient File System)

요구 사항

   
지원되는 최소 클라이언트 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

OVERLAPPED

OpenFile

ReadFile

WriteFile