none
ReadDirectoryChangesW() API가 정상동작 하는것 맞나요? RRS feed

  • 질문

  • 안녕하세요.

    현재 특정 디렉토리 내부에 있는 파일의 변경여부와 변경된 파일의 이름을 알고싶은 상황입니다. 그 파일은 이미지파일로 한정되는데요, ReadDirectoryChangesW() API와 FILE_NOTIFY_INFORMATION 구조체를 가지고 별도의 스레드에서 체크 해주는 코드를 구현했습니다.

    실제로 테스트를 해보면 파일이 변경됐다고 잡아주는 경우도 있고, 그렇지 못한 경우도 있네요.

    현재 상황을 좀 더 자세히 설명드리면, 이미지 파일을 이미지편집 프로그램으로 편집을 합니다.(MS 그림판도 포함) 그리고 다른이름으로 저장이 아닌 바로 덮어쓰기를 할 경우에는, Translation3.png_origin_temp00.png 라는 이름으로만 API가 변경사항을 추적을 하고, 원본 이미지 파일 이름인 Translation3.png는 전혀 잡아내질 못하거나 잡아내거나 합니다.

    혹시 API문제인건지, 사용법이 잘못된건지... 저는 코드를 다음처럼 썼습니다.

    HANDLE hDir = CreateFile(_T("D:\\Pictures",
    	FILE_LIST_DIRECTORY,
    	FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
    	NULL,
    	OPEN_EXISTING,
    	FILE_FLAG_BACKUP_SEMANTICS,
    	NULL
    	);
    	DWORD BytesReturned, dwNotifyFilter;
    	dwNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME |
    		FILE_NOTIFY_CHANGE_DIR_NAME |
    		FILE_NOTIFY_CHANGE_ATTRIBUTES |
    		FILE_NOTIFY_CHANGE_SIZE |
    		FILE_NOTIFY_CHANGE_LAST_WRITE |
    		FILE_NOTIFY_CHANGE_LAST_ACCESS |
    		FILE_NOTIFY_CHANGE_CREATION |
    		FILE_NOTIFY_CHANGE_SECURITY;
    	CONST DWORD cbBuffer = 1024*1024;
    	pThreadData->pBuffer = (PBYTE)malloc(cbBuffer);
    	ZeroMemory(pThreadData->pBuffer, cbBuffer);
    
    	while(1)
    	{
    		PFILE_NOTIFY_INFORMATION pfni;
    		BOOL bOK = ReadDirectoryChangesW(hDir, pThreadData->pBuffer, cbBuffer, FALSE,
    	dwNotifyFilter, &BytesReturned, NULL, NULL);
    		if(!bOK)
    		{
    			break;
    		}
    		do {
    			.........
    
    			pfni = (FILE_NOTIFY_INFORMATION *)((PBYTE)pfni + pfni->NextEntryOffset);
    		}while(pfni->NextEntryOffset > 0);
    	}


    별도의 스레드 내에서 처리하고 있습니다. pThreadData는 구조체 포인터로, 할당한 메모리를 스레드 밖에서 해제해주기 위해서 이렇게 썼습니다.

    -----------------------------------------------------------------------------------------------------------

    방금 다시 확인해 봤는데, 못잡아내는건 아닌것 같더군요. 변경된 파일명만 확인했더니 유효한 길이까지는 못봤습니다. 확실히 유효한 길이까지 생각해보니 원본 파일과 임시 파일도 모두 잡아내더군요. 그런데...... 이미지파일을 편집하고 저장했을 때 파일 사이즈나 속성등이 변경된 것이 아니라, 파일명과 디렉토리명만 바뀌었다고 몇 번 잡히네요. 혹시 Windows에서 이미지 파일을 저장할 때 별도의 공간에 임시 파일을 만들어 놓고 그걸 원본 경로에 옮기는 방식으로 구현되어 있는 것인지요?

    MS 그림판은 그런 형식으로 구현되어 있는것 같았지만, 만약 제 예상이 맞다면 다른 이미지 편집 프로그램들도 모두 그런 방식으로 처리되는 것은 어떤 이유인지 궁금합니다.

    • 편집됨 strawnut 2014년 10월 25일 토요일 오전 4:27 질문 변경
    2014년 10월 25일 토요일 오전 3:09