다음을 통해 공유


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

대기 작업이 완료되었는지 여부를 확인하기 위해 함수가 확인하는 필터 조건입니다. 이 매개 변수는 다음 값 중 하나 이상일 수 있습니다.

의미
FILE_NOTIFY_CHANGE_FILE_NAME
0x00000001
확인된 디렉터리 또는 하위 트리에서 파일 이름을 변경하면 변경 알림이 반환할 작업을 기다리게 됩니다. 변경 내용에는 파일 이름 바꾸기, 만들기 또는 삭제가 포함되었습니다.
FILE_NOTIFY_CHANGE_DIR_NAME
0x00000002
감시된 디렉터리 또는 하위 트리의 디렉터리 이름 변경으로 인해 변경 알림 대기 작업이 반환됩니다. 변경 내용에는 디렉터리 만들기 또는 삭제가 포함됩니다.
FILE_NOTIFY_CHANGE_ATTRIBUTES
0x00000004
확인된 디렉터리 또는 하위 트리에서 속성을 변경하면 변경 알림이 반환할 작업을 기다리게 됩니다.
FILE_NOTIFY_CHANGE_SIZE
0x00000008
확인된 디렉터리 또는 하위 트리에서 파일 크기를 변경하면 변경 알림이 반환할 작업을 기다리게 됩니다. 운영 체제는 파일이 디스크에 기록될 때만 파일 크기에서 변경을 감지합니다. 광범위한 캐싱을 사용하는 운영 체제의 경우에는 캐시가 충분히 플러시될 때만 감지가 발생합니다.
FILE_NOTIFY_CHANGE_LAST_WRITE
0x00000010
확인된 디렉터리 또는 하위 트리에서 파일의 마지막 기록 시간을 변경하면 변경 알림이 반환할 작업을 기다리게 됩니다. 운영 체제는 파일이 디스크에 기록될 때만 마지막 기록 시간에 대한 변경을 감지합니다. 광범위한 캐싱을 사용하는 운영 체제의 경우에는 캐시가 충분히 플러시될 때만 감지가 발생합니다.
FILE_NOTIFY_CHANGE_LAST_ACCESS
0x00000020
감시된 디렉터리 또는 하위 트리에서 파일의 마지막 액세스 시간을 변경하면 변경 알림 대기 작업이 반환됩니다.
FILE_NOTIFY_CHANGE_CREATION
0x00000040
감시된 디렉터리 또는 하위 트리에서 파일 생성 시간을 변경하면 변경 알림 대기 작업이 반환됩니다.
FILE_NOTIFY_CHANGE_SECURITY
0x00000100
감시된 디렉터리 또는 하위 트리에서 보안 설명자가 변경되면 변경 알림 대기 작업이 반환됩니다.

[out, optional] lpBytesReturned

동기 호출의 경우 이 매개 변수는 lpBuffer 매개 변수로 전송된 바이트 수를 받습니다. 비동기 호출의 경우 이 매개 변수는 정의되지 않습니다. 전송된 바이트 수를 검색하려면 비동기 알림 기술을 사용해야 합니다.

[in, out, optional] lpOverlapped

비동기 작업 중에 사용할 데이터를 제공하는 OVERLAPPED 구조체에 대한 포인터입니다. 그렇지 않으면 이 값은 NULL입니다. 이 구조체의 OffsetOffsetHigh 멤버는 사용되지 않습니다.

[in, optional] lpCompletionRoutine

작업이 완료되거나 취소되고 호출 스레드가 경고 대기 상태일 때 호출할 완료 루틴에 대한 포인터입니다. 이 완료 루틴에 대한 자세한 내용은 FileIOCompletionRoutine을 참조하세요.

[in] ReadDirectoryNotifyInformationClass

ReadDirectoryChangesExWlpBuffer 매개 변수가 가리키는 버퍼에 기록해야 하는 정보의 형식입니다. 정보가 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 멤버는 시스템에서 사용되지 않으므로 직접 사용할 수 있습니다.
자세한 내용은 동기 및 비동기 I/O를 참조하세요.

버퍼 길이가 64KB보다 크고 애플리케이션이 네트워크를 통해 디렉터리를 모니터링하는 경우 ReadDirectoryChangesExWERROR_INVALID_PARAMETER 실패합니다. 이는 기본 파일 공유 프로토콜의 패킷 크기 제한 때문입니다.

버퍼가 DWORD 경계에 정렬되지 않으면 ReadDirectoryChangesExWERROR_NOACCESS 실패합니다.

ReadDirectoryChangesExW 는 시스템이 디렉터리에 대한 모든 변경 내용을 기록할 수 없을 때 ERROR_NOTIFY_ENUM_DIR 실패합니다. 이 경우 디렉터리 또는 하위 트리를 열거하여 변경 내용을 계산해야 합니다.

짧은 이름을 사용하여 파일을 연 경우 짧은 이름에 대한 변경 알림을 받을 수 있습니다.

ReadDirectoryChangesExW 는 현재 NTFS 파일 시스템에 대해서만 지원됩니다.

거래된 작업

디렉터리 핸들에 바인딩된 트랜잭션이 있는 경우 알림은 적절한 트랜잭션 격리 규칙을 따릅니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10 버전 1709 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2019 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 winbase.h(Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

CreateFile

CreateIoCompletionPort

디렉터리 관리 함수

FILE_NOTIFY_EXTENDED_INFORMATION

FILE_NOTIFY_INFORMATION

FileIOCompletionRoutine

GetOverlappedResult

GetQueuedCompletionStatus

OVERLAPPED

READ_DIRECTORY_NOTIFY_INFORMATION_CLASS