블로그 이미지

냥날의 티스토리

Rss feed

파일변경 알림 ReadDirectoryChangesW() 함수

프로그래밍 2012.05.09 11:20
Excel 파일이 변경되면 자동으로 감시해서 reload하는 기능을 구현하려고 하는데 생각보다 골치아프다.
일단 여러 가지 방법이 있다.

제일 만만한 건 ReadDirectoryChangesW() 함수인데..
파일 복사가 엄청나게 많이 일어나는 상황이면 노티파이가 사라져 버릴 수 있다고 한다. (아래 링크 참조)

근데 테스트해 보니 오히려 노티파이가 너무 많아서 곤란. 아무래도 파일을 write하는 동안/혹은 flush될 때마다 한 번씩발생하는 것 같다.

노티를 받더라도 변경된 파일의 시간이나 사이즈 등을 검사해서 확인하지 않으면 중복작업을 엄청나게 여러 번 수행하게 될 수도 있다.

또는 이런 방법으로 중복작업을 줄일 수 있다:
이 함수는 결과를 APC로 받을 수 있는데 이를 위해서 SleepEx()같은 걸 호출해 주어야 한다. 이때 APC 호출이 모여서 일어나므로, APC callback function에서는 변경된 파일의 리스트만 저장해 두고(set<string>을 써서 중복파일은 1개만 insert) SleepEx()가 반환된 후에 이 결과에서 릴로드를 처리하면 중복작업을 줄일 수 있다.


그래서.. FindFirstChangeNotification() 함수도 테스트 해 봤다. 얘는 또 다른 오묘함이 있다.

  1. 제일 곤란했던 상황은..
  2. 여러 개의 폴더를 동시에 감시하고 싶었다.
  3. WaitForMultipleObjects()를 썼다.
  4. 근데 signal을 받으면 FindNextChangeNotification(handle)을 한번 더 호출해야 함.
  5. 혹시라도 signal이 2개가 동시에 깨어나면 WaitForMultipleObjects()의 결과값으로는 1개밖에 알 수가 없음.
  6. 감시하고 싶은 폴더 개수만큼 WaitForSingleObject()를 쓰는 수 밖에 없음..
  7. 이건 좀..


강호의 말로는:

WaitForMultipleObjects()는 signal 1개당 1번씩 불린다고 한다.

따라서 signal을 받으면 dwMilliseconds=0 으로 주고 WaitForMultipleObjects()를 여러 번 호출하는게 정석이라고 하네. 이렇게 하면 문제 없겠다.

덤으로 이 루프를 처리할 때는 signal 받은 핸들이 N번째이면 N+1번째 부터 wait하는 게 정석.





관련링크:
http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html

신고

'프로그래밍' 카테고리의 다른 글

std::string Trim  (0) 2012.05.12
파일변경 알림 ReadDirectoryChangesW() 함수  (1) 2012.05.09
HDR 쓸 때 주의할 점  (0) 2008.11.24
minidump  (0) 2008.03.04
[GDC] Networked Physics  (1) 2008.02.23
프로그래밍(재탕)  (3) 2007.12.19
TOTAL 27,750 TODAY 17