'MoveFileEx'에 해당되는 글 1건

  1. 2010.01.22 Vista에서 MoveFileEx 실패 - 에러 5

파일 교체를 위해 DeleteFile 후에 MoveFile을 하는 기존 코드가 있어서
이번에 MoveFileEx로 바꿨습니다. MoveFileEx의 경우 플래그를 지정하여,
기존 MoveFile에 비해 다양한 동작을 할 수 가 있는데요.(MSDN 참고)

그중 MOVEFILE_REPLACE_EXISTING 플래그를 이용하여
DeleteFile을 하지 않고 파일을 오버라이팅 하는 기능을 사용하였습니다.

기존에 어떤 문제인지(안티 바이러스로 의심하고 있습니다.) 파일 권한 때문에
DeleteFile과 MoveFile을 해서 파일을 교체하는데 실패가 빈번히 발생하고 있어서 수정을 해봤는데요.

MoveFileEx로 교체 후에는 특이하게 사용자의 OS가 Vista일 경우에 에러 5를 내뱉으며 실패를 하게 되었습니다.
(MoveFileEx는 윈도우 2000 이상부터 사용할 수 있습니다.)

에러코드 5번은 Access denied로 파일에 권한이 없어 실패한 경우 입니다.
이것도 테스트 결과 기존에 있던 파일에 권한은 상관이 없고 새로 교체하려는 파일에 권한이 없을 경우에 발생하는 에러입니다.
(신기하게 기존에 있던 파일에 접근 권한이 없더라도 새로운 파일로 교체가 되더군요.)

사용자들의 OS 분포도를 비교했을 때 확실히 윈XP와 윈7에서 실패율은 떨어졌지만
Vista의 실패가 급증해서 결국 기존과 비슷하거나 상황이 더 악화되어버린 것이죠.

그래서 왜 Vista에서 MoveFileEx가 실패하는지에 대해 여러곳으로 검색을 해봤는데요.
결론은 Vista에서 돌아가고 있는 Window Search(SearchIndexer.exe)라는 서비스 때문이였습니다.

Vista의 경우 빠른 파일 검색을 위해 Window Search라는 서비스가 돌아가고 있는데요.
Window Search가 인덱싱을 위해 파일에 어떤 짓을 하는지 모르겠지만
서비스를 정지시켜놓고 MoveFileEx를 테스트 할 경우 실패를 하지 않고, 서비스가 돌아갈 때는 에러 5로 실패를 하더군요.

아래는 구글링을 통해 찾은 정보 입니다.
http://stackoverflow.com/questions/153257/random-movefileex-failures-on-vista-access-denied-looks-like-caused-by-search-i

윈도우XP와 윈도우7에도 Window Search 서비스는 존재하는데요.
윈도우 XP는 나중에 업데이트를 통해 추가 된 기능입니다.
즉, Vista를 통해 Window Search 기능의 문제가 될만한 점을 파악하여
MS에서 나중에 들어간 윈XP와 윈7에는 수정을 한게 아닌가 싶습니다.

윈도우XP와 윈도우7에서는 Window Search 서비스의 시작 유무에 상관 없이 잘 되고있거든요.

그리고 위 URL 주소에 해결책으로 파일 속성을 FILE_ATTRIBUTE_TEMPORARYFILE_ATTRIBUTE_NOT_CONTENT_INDEXED로 설정하면 Vista에서 MoveFileEx의 설치 실패율이 떨어진다고 되어있는데요.
테스트 결과 FILE_ATTRIBUTE_TEMPORARY는 확실히 설치 실패율이 떨어지지만
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED는 별다른 영향을 미치지 않은 것으로 나타났습니다.

FILE_ATTRIBUTE_TEMPORARY 속성은 인터넷 임시 파일 처럼 곧 삭제될 또는 삭제 되어도 아무 상관 없다는 의미를 가지고 있습니다.
클라이언트가 일반적으로 사용하는 파일에 적용하기에는 무리가 따르는 속성인데요.

결국 Vista에서 MoveFileEx를 사용할 수 없다는 결론을 내렸습니다.
(물론 사용자의 OS가 Vista이고 Window Search 서비스가 돌아가는지 판단하여 코드를 짤 수도 있겠지만,
이를 위해 클라이언트에 부하를 주느니 Vista 유저일 경우는 전부 DeleteFile과 MoveFile을 이용하는게 나을 것 같습니다.)

카테고리

분류 전체보기 (28)
주절주절 (15)
바라보기 (5)
구경하기 (4)
기억하기 (4)

최근에 받은 트랙백

달력

«   2019/08   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Total : 12,717
Today : 3 Yesterday : 0
Statistics Graph