Media Log

MoveFileEx 함수는 파일 이름 변경이나 삭제를 컴퓨터가 재시작할 때 까지 지연시킬 수 있는 상당히 유용한 옵션이 있는데 꽤 많은 사람들이 잘 모르고 있는 것 같다.
이 옵션은 스마트 업데이터 같은 프로그램이 DLL을 교체 시켜야 한다거나 언인스톨러시 파일을 삭제해야 하는데 다른 곳에서 이미 파일이 사용중이어서 삭제할 수 없는 경우에 유용하게 쓸 수 있다.

MoveFile 함수는 내부적으로 CreateFile 함수를 통해 파일을 오픈하는데 이 때 DesiredAccess로 DELETE을 사용한다. 파일이 잘 열렸다면 RenameInformation IRP를 날린 후 핸들을 닫고 성공으로 반환하지만, 이미 다른 위치에서 파일이 열려있었다면 먼저 파일을 연쪽에서 FILE_SHARE_DELETE를 함께 주지 않았었을 경우 파일 열기가 ERROR_SHARING_VIOLATION 으로 실패하게 되어 MoveFile 함수 또한 실패로 리턴해버리게 되는 것이다.

재부팅 시에라도 dll 등을 교체시켜주거나 깨끗하게 삭제하기를 원한다면 MoveFileEx함수를 호출 할 때 세번째 파라메터로 MOVEFILE_DELAY_UNTIL_REBOOT 옵션을 주면 되는데, 이렇게 하면 MoveFileEx함수는 레지스트리의 HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations 위치에 어떤 오퍼레이션이었는지 정보를 적어 놓기만 하고 리턴한다. 시스템이 재부팅 되고 나서 응용프로그램들이 실행되기 전 운영체제에서 레지스트리를 확인해 보고 해당 동작을(이름변경 혹은 삭제) 수행해 주기 때문에 어떤 파일이던지 삭제가 가능하다. HKLM 위치에 써야 하기 때문에 관리자 권한은 필요하다.

이와 관련된 몇 가지 알아두면 좋을 지식들이 있다.
  • 다른 곳에서 파일을 열고 있다고 이름 변경을 못하는 것은 아니다. 먼저 파일을 연쪽에서 어떤 공유 모드로 파일을 열었는지가 중요하다. 파일을 먼저 오픈 하는 쪽에서 FILE_SHARE_DELETE옵션을 주어서 CreateFile을 하면 다른 위치에서 해당 파일의 이름을 변경 할 수 있다. 심지어는 삭제도 가능한데(DeleteFile을 호출하면 성공한다) 이때는 파일이 삭제 상태로만 마킹 되며 파일 시스템 드라이버는 해당 파일을 열어 놓은 모든 핸들이 닫힐 때 실제로 삭제를 수행한다. 이렇게 삭제 상태로 마킹되어 있는 동안에는 또 다른 곳에서 파일 오픈 시도가 생겼을 때 ERROR_ACCESS_DENIED 에러가 발생하게 된다. 파일 핸들을 닫기 전까지는 이런 DELETE_PENDING 상태의 파일을 삭제되지 않은 상태의 파일로 다시 돌리는 것 또한 가능하다.
  • 다른 한 쪽에서 파일 삭제를 허용하지 않고 먼저 파일을 열어두었을 시에, MoveFileEx에 MOVEFILE_DELAY_UNTIL_REBOOT 옵션을 주어 함수를 호출하더라도 파일 열기시 ERROR_SHARING_VIOLATION에러를 받게 되지만 이 때는 MoveFileEx 함수가 실패로 리턴하지 않고 레지스트리에 기록을 해주기 때문에, 어떤 파일이던지 간에 이름 변경이나 삭제를 할 수가 있는 것이다.
  • 함수 모양을 봤을 때 MoveFileEx나 DeleteFile처럼 HANDLE을 인자로 전달받지 않고 파일 경로를 전달 받는 함수는 모두 내부적으로 파일을 오픈한다.
  • SetFileInformationByHandle 함수를 사용하면 추가적으로 파일을 다시 열지 않고 Rename, Delete등의 작업을 할 수 있다. 이 함수는 파일 시스템 드라이버에 전달되는 IRP와 거의 비슷하게 매핑되는 아주 강력한 함수이다. 파일 속성에 대한 모든 조작은 이 함수를 통해서 할 수 있다.
    하지만 워낙 저수준의 함수이기 때문에 사용법이 조금 어렵게 느껴질 수도 있다.
    아래 글에 해당 함수를 사용하여 이름 변경을 하는 코드에 대한 설명이 있다.
    하위 디렉터리의 파일이 변경 되었는지 감지하는 법
     
저작자 표시 비영리 동일 조건 변경 허락
신고

submit


구글 플러스에서는 사진을 무제한으로 올릴 수 있다고 해서 좀 놀랐다.
어떻게 사진을 무한으로 올릴 수 있는거지. 아무리 돈이 많아도 그걸 다 감당해낼 수 있다는 말인가.

구글 플러스는 피카사와 연동되어 있는데 피카사는 1G 용량을 무료로 제공한다.
하지만 기존 피카사에서는 800 * 800 픽셀 사이즈까지는 용량제한 없이 무료로 올릴 수 있게 해줬었던 것 같다. 즉, 저런 작은 해상도의 파일들은 많이 올려도 용량을 전혀 차지 하지 않는다.

http://picasa.google.com/support/bin/answer.py?answer=1224181
 

그런데 구글 플러스에 가입을 하고 나면 2048 * 2048 이하의 파일들은 용량 제한 없이 올릴 수 있게 된다. 가입하지 않은 사람들은 여전히 800 * 800이다. 이것만으로도 구글 플러스에 가입하고 싶어지지 않은가?
그런데 2048 * 2048보다 해상도가 작더라도 용량을 줄이기 위해 어느 정도 파일을 더 손실 시키는 것 같긴하다. 또한 PNG같은 비손실 포맷들은 모두 jpg로 변환되어 올라간다.

그렇다고는 해도 정말 끝내준다. 구글 스토리지 비용이 그다지 비싸기 않기 때문에(1년 20기가가 5000원이며 Google Docs등 다른 서비스와 용량이 공유된다) 제대로 보관하고 싶은 사진들은 피카사를 통해 원본 그대로 올리고 좀 쓸데없는 사진들은 구글 플러스를 통해 자동 축소 시켜서 올려도 되겠다.

이제 사진 관리도 비용 걱정 없이 클라우드에서 할 수 있는 때가 온 것인가.
피카사 웹앨범도 처음 만지작 거려봤는데, 생각보다 편리했다. 참 좋은 세상이다.
저작자 표시 비영리 동일 조건 변경 허락
신고

submit

플라워 바이 겐조

2011.07.12 00:11 | 에세이






저작자 표시 비영리 동일 조건 변경 허락
신고

'에세이' 카테고리의 다른 글

Devon 2011, 왜 김택진이 욕을 먹어야 하는가  (2) 2011.11.28
안철수연구소 오픈 하우스 이벤트  (0) 2011.10.22
플라워 바이 겐조  (0) 2011.07.12
클라우드가 더 안전하다  (8) 2011.06.13
조그만 술집, 여행  (4) 2011.04.24
디지털 기억  (2) 2011.03.13

submit