ReadDirectoryChangesW 함수(winbase.h)

지정된 디렉터리 내의 변경 내용을 설명하는 정보를 검색합니다. 함수는 지정된 디렉터리 자체에 변경 내용을 보고하지 않습니다.

볼륨의 변경 내용을 추적하려면 변경 저널을 참조하세요.

구문

BOOL ReadDirectoryChangesW(
  [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] hDirectory

모니터링할 디렉터리에 대한 핸들입니다. 이 디렉터리를 FILE_LIST_DIRECTORY 액세스 권한 또는 FILE_LIST_DIRECTORY 액세스 권한을 포함하는 GENERIC_READ같은 액세스 권한 으로 열어야 합니다.

[out] lpBuffer

읽기 결과를 반환할 DWORD 정렬 형식 버퍼에 대한 포인터입니다. 이 버퍼의 구조는 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을 참조하세요.

반환 값

함수가 성공하면 반환 값이 0이 아닙니다. 동기 호출의 경우 작업이 성공했음을 의미합니다. 비동기 호출의 경우 작업이 성공적으로 큐에 대기되었음을 나타냅니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

네트워크 리다이렉터 또는 대상 파일 시스템에서 이 작업을 지원하지 않으면 ERROR_INVALID_FUNCTION 함께 함수가 실패합니다.

설명

디렉터리에 대한 핸들을 가져오려면 FILE_FLAG_BACKUP_SEMANTICS 플래그와 함께 CreateFile 함수를 사용합니다.

ReadDirectoryChangesW에 대한 호출을 동기적으로 또는 비동기적으로 완료할 수 있습니다. 비동기 완성을 지정하려면 위와 같이 CreateFile을 사용하여 디렉터리를 열지만 dwFlagsAndAttributes 매개 변수에 FILE_FLAG_OVERLAPPED 특성을 추가로 지정합니다. 그런 다음 ReadDirectoryChangesW를 호출할 때 OVERLAPPED 구조를 지정합니다.

ReadDirectoryChangesW를 처음 호출하면 시스템에서 변경 정보를 저장할 버퍼를 할당합니다. 이 버퍼는 디렉터리 핸들이 닫혀 있고 수명 동안 크기가 변경되지 않을 때까지 디렉터리 핸들과 연결됩니다. 이 함수에 대한 호출 간에 발생하는 디렉터리 변경 내용은 버퍼에 추가된 다음 다음 호출과 함께 반환됩니다. 버퍼 오버플로가 발생하면 ReadDirectoryChangesW 는 여전히 true를 반환하지만 버퍼의 전체 콘텐츠는 삭제되고 lpBytesReturned 매개 변수는 0이 됩니다. 이는 버퍼가 너무 작아서 발생한 모든 변경 내용을 보관할 수 없음을 나타냅니다.

동기 완료에 성공하면 lpBuffer 매개 변수는 형식이 지정된 버퍼이며 버퍼에 기록된 바이트 수는 lpBytesReturned에서 사용할 수 있습니다. 전송된 바이트 수가 0이면 버퍼가 너무 커서 시스템이 할당할 수 없거나 너무 작아서 디렉터리 또는 하위 트리에서 발생한 모든 변경 내용에 대한 자세한 정보를 제공할 수 없습니다. 이 경우 디렉터리 또는 하위 트리를 열거하여 변경 내용을 계산해야 합니다.

비동기 완료의 경우 다음 세 가지 방법 중 하나로 알림을 받을 수 있습니다.

  • GetOverlappedResult 함수 사용. GetOverlappedResult를 통해 알림을 받으려면 lpCompletionRoutine 매개 변수에 완료 루틴을 지정하지 마세요. OVERLAPPED 구조체의 hEvent 멤버를 고유한 이벤트로 설정해야 합니다.
  • GetQueuedCompletionStatus 함수를 사용합니다. GetQueuedCompletionStatus를 통해 알림을 받으려면 lpCompletionRoutine에서 완료 루틴을 지정하지 마세요. CreateIoCompletionPort 함수를 호출하여 디렉터리 핸들 hDirectory를 완료 포트와 연결합니다.
  • 완료 루틴 사용. 완료 루틴을 통해 알림을 받으려면 디렉터리를 완료 포트와 연결하지 마세요. lpCompletionRoutine에서 완료 루틴을 지정합니다. 이 루틴은 스레드가 경고 가능한 대기 상태에 있는 동안 작업이 완료되거나 취소될 때마다 호출됩니다. OVERLAPPED 구조체의 hEvent 멤버는 시스템에서 사용되지 않으므로 직접 사용할 수 있습니다.
자세한 내용은 동기 및 비동기 I/O를 참조하세요.

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

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

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

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

Windows 8 및 Windows Server 2012에서 이 함수는 다음 기술을 통해 지원됩니다.

기술 지원됨
SMB(서버 메시지 블록) 3.0 프로토콜
SMB 3.0 TFO(투명 장애 조치(failover))
SO(스케일 아웃 파일 공유)를 사용하는 SMB 3.0
CsvFS(클러스터 공유 볼륨 파일 시스템)
ReFS(Resilient File System)
 

거래된 작업

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

요구 사항

   
지원되는 최소 클라이언트 Windows XP [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winbase.h(Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

CreateFile

CreateIoCompletionPort

디렉터리 관리 함수

FILE_NOTIFY_INFORMATION

FileIOCompletionRoutine

GetOverlappedResult

GetQueuedCompletionStatus

OVERLAPPED