ReadDirectoryChangesExW 함수(winbase.h)
지정된 디렉터리 내의 변경 내용을 설명하는 정보를 검색합니다. 이 정보에는 해당 정보 유형이 지정된 경우 확장된 정보가 포함될 수 있습니다. 함수는 지정된 디렉터리 자체에 변경 내용을 보고하지 않습니다.
볼륨의 변경 내용을 추적하려면 변경 저널을 참조하세요.
구문
BOOL ReadDirectoryChangesExW(
[in] HANDLE hDirectory,
[out] LPVOID lpBuffer,
[in] DWORD nBufferLength,
[in] BOOL bWatchSubtree,
[in] DWORD dwNotifyFilter,
[out, optional] LPDWORD lpBytesReturned,
[in, out, optional] LPOVERLAPPED lpOverlapped,
[in, optional] LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
[in] READ_DIRECTORY_NOTIFY_INFORMATION_CLASS ReadDirectoryNotifyInformationClass
);
매개 변수
[in] hDirectory
모니터링할 디렉터리에 대한 핸들입니다. FILE_LIST_DIRECTORY 액세스 권한 또는 FILE_LIST_DIRECTORY 액세스 권한을 포함하는 GENERIC_READ같은 액세스 권한 으로 이 디렉터리를 열어야 합니다.
[out] lpBuffer
ReadDirectoryChangesExW에서 읽기 결과를 반환해야 하는 DWORD 정렬 형식 버퍼에 대한 포인터입니다. 이 버퍼의 구조는 ReadDirectoryNotifyInformationClass 매개 변수의 값이 ReadDirectoryNotifyExtendedInformation인 경우 FILE_NOTIFY_EXTENDED_INFORMATION구조체에 의해 정의되거나 ReadDirectoryNotifyInformationClass가 ReadDirectoryNotifyInformation인 경우 FILE_NOTIFY_INFORMATION 구조에 의해 정의됩니다.
이 버퍼는 디렉터리를 여는 방법과 lpOverlapped 매개 변수에 지정된 값에 따라 동기적으로 또는 비동기적으로 채워집니다. 자세한 내용은 주의 섹션을 참조하세요.
[in] nBufferLength
lpBuffer 매개 변수가 가리키는 버퍼의 크기(바이트)입니다.
[in] bWatchSubtree
이 매개 변수가 TRUE이면 함수는 지정된 디렉터리에 루팅된 디렉터리 트리를 모니터링합니다. 이 매개 변수가 FALSE이면 함수는 hDirectory 매개 변수로 지정된 디렉터리만 모니터링합니다.
[in] dwNotifyFilter
대기 작업이 완료되었는지 여부를 확인하기 위해 함수가 확인하는 필터 조건입니다. 이 매개 변수는 다음 값 중 하나 이상일 수 있습니다.
[out, optional] lpBytesReturned
동기 호출의 경우 이 매개 변수는 lpBuffer 매개 변수로 전송된 바이트 수를 받습니다. 비동기 호출의 경우 이 매개 변수는 정의되지 않습니다. 전송된 바이트 수를 검색하려면 비동기 알림 기술을 사용해야 합니다.
[in, out, optional] lpOverlapped
비동기 작업 중에 사용할 데이터를 제공하는 OVERLAPPED 구조체에 대한 포인터입니다. 그렇지 않으면 이 값은 NULL입니다. 이 구조체의 Offset 및 OffsetHigh 멤버는 사용되지 않습니다.
[in, optional] lpCompletionRoutine
작업이 완료되거나 취소되고 호출 스레드가 경고 대기 상태일 때 호출할 완료 루틴에 대한 포인터입니다. 이 완료 루틴에 대한 자세한 내용은 FileIOCompletionRoutine을 참조하세요.
[in] ReadDirectoryNotifyInformationClass
ReadDirectoryChangesExW가 lpBuffer 매개 변수가 가리키는 버퍼에 기록해야 하는 정보의 형식입니다. 정보가 FILE_NOTIFY_INFORMATION 구조로 구성되어야 함을 나타내려면 ReadDirectoryNotifyInformation을 지정하거나, 정보가 FILE_NOTIFY_EXTENDED_INFORMATION구조로 구성되어야 함을 나타내는 ReadDirectoryNotifyExtendedInformation을 지정합니다.
반환 값
함수가 성공하면 반환 값이 0이 아닙니다. 동기 호출의 경우 작업이 성공했음을 의미합니다. 비동기 호출의 경우 작업이 성공적으로 큐에 대기되었음을 나타냅니다.
함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
네트워크 리다이렉터 또는 대상 파일 시스템에서 이 작업을 지원하지 않으면 ERROR_INVALID_FUNCTION 함수가 실패합니다.
설명
디렉터리에 대한 핸들을 가져오려면 FILE_FLAG_BACKUP_SEMANTICS 플래그와 함께 CreateFile 함수를 사용합니다.
ReadDirectoryChangesExW에 대한 호출은 동기적으로 또는 비동기적으로 완료될 수 있습니다. 비동기 완성을 지정하려면 위와 같이 CreateFile을 사용하여 디렉터리를 열고 dwFlagsAndAttributes 매개 변수에 FILE_FLAG_OVERLAPPED 특성을 추가로 지정합니다. 그런 다음 ReadDirectoryChangesExW를 호출할 때 OVERLAPPED 구조를 지정합니다.
ReadDirectoryChangesExW를 처음 호출하면 시스템에서 변경 정보를 저장할 버퍼를 할당합니다. 이 버퍼는 닫혀 있고 수명 동안 크기가 변경되지 않을 때까지 디렉터리 핸들과 연결됩니다. 이 함수에 대한 호출 간에 발생하는 디렉터리 변경 내용은 버퍼에 추가된 다음, 다음 호출과 함께 반환됩니다. 버퍼 오버플로가 발생하면 ReadDirectoryChangesExW 는 여전히 true를 반환하지만 버퍼의 전체 콘텐츠는 삭제되고 lpBytesReturned 매개 변수는 0이 됩니다. 이는 버퍼가 너무 작아서 발생한 모든 변경 내용을 보유할 수 없음을 나타냅니다.
동기 완료에 성공하면 lpBuffer 매개 변수는 형식이 지정된 버퍼이며 버퍼에 기록된 바이트 수는 lpBytesReturned에서 사용할 수 있습니다. 전송된 바이트 수가 0이면 버퍼가 너무 커서 시스템이 할당할 수 없거나 너무 작아서 디렉터리 또는 하위 트리에서 발생한 모든 변경 내용에 대한 자세한 정보를 제공할 수 없습니다. 이 경우 디렉터리 또는 하위 트리를 열거하여 변경 내용을 계산해야 합니다.
비동기 완료의 경우 다음 세 가지 방법 중 하나로 알림을 받을 수 있습니다.
- GetOverlappedResult 함수를 사용합니다. GetOverlappedResult를 통해 알림을 받으려면 lpCompletionRoutine 매개 변수에 완료 루틴을 지정하지 마세요. OVERLAPPED 구조체의 hEvent 멤버를 고유한 이벤트로 설정해야 합니다.
- GetQueuedCompletionStatus 함수를 사용합니다. GetQueuedCompletionStatus를 통해 알림을 받으려면 lpCompletionRoutine에서 완료 루틴을 지정하지 마세요. CreateIoCompletionPort 함수를 호출하여 디렉터리 핸들 hDirectory를 완료 포트와 연결합니다.
- 완료 루틴 사용. 완료 루틴을 통해 알림을 받으려면 디렉터리를 완료 포트와 연결하지 마세요. lpCompletionRoutine에서 완료 루틴을 지정합니다. 이 루틴은 스레드가 경고 대기 상태에 있는 동안 작업이 완료되거나 취소될 때마다 호출됩니다. OVERLAPPED 구조체의 hEvent 멤버는 시스템에서 사용되지 않으므로 직접 사용할 수 있습니다.
버퍼 길이가 64KB보다 크고 애플리케이션이 네트워크를 통해 디렉터리를 모니터링하는 경우 ReadDirectoryChangesExW가 ERROR_INVALID_PARAMETER 실패합니다. 이는 기본 파일 공유 프로토콜의 패킷 크기 제한 때문입니다.
버퍼가 DWORD 경계에 정렬되지 않으면 ReadDirectoryChangesExW가 ERROR_NOACCESS 실패합니다.
ReadDirectoryChangesExW 는 시스템이 디렉터리에 대한 모든 변경 내용을 기록할 수 없을 때 ERROR_NOTIFY_ENUM_DIR 실패합니다. 이 경우 디렉터리 또는 하위 트리를 열거하여 변경 내용을 계산해야 합니다.
짧은 이름을 사용하여 파일을 연 경우 짧은 이름에 대한 변경 알림을 받을 수 있습니다.
ReadDirectoryChangesExW 는 현재 NTFS 파일 시스템에 대해서만 지원됩니다.
거래된 작업
디렉터리 핸들에 바인딩된 트랜잭션이 있는 경우 알림은 적절한 트랜잭션 격리 규칙을 따릅니다.요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 10 버전 1709 [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2019 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | winbase.h(Windows.h 포함) |
라이브러리 | Kernel32.lib |
DLL | Kernel32.dll |