MoveFileEx

원형

BOOL MoveFileEx(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, DWORD dwFlags);

MFC 원형

해당하는 함수 없음

인수

▶lpExistingFileName : 옮기고자 하는 파일이나 디렉토리의 이름

▶lpNewFileName : 새 파일, 디렉토리 이름. 새로 만들어지므로 기존에 존재해서는 안된다. 파일은 다른 드라이브에 있어도 상관없지만 디렉토리는 반드시 같은 드라이브에 있어야 한다.MOVEFILE_DELAY_UNTIL_REBOOT 플래그가 지정되어 있고 이 인수가 NULL이면 다음 부팅시에 파일을 삭제한다.

▶dwFlags : 파일을 이동시킬 방법을 지정하며 다음 플래그의 조합을 지정할 수 있다.

플래그

설명

MOVEFILE_COPY_ALLOWED

파일이 다른 드라이브간에 이동될 때는 CopyFile, DeleteFile 함수 호출을 시뮬레이트하도록 한다.

MOVEFILE_CREATE_HARDLINK

예약

MOVEFILE_DELAY_UNTIL_REBOOT

운영체제를 재부팅할 때까지 이동을 하지 않는다. 즉 다음번 운영체제 부팅시에 파일을 이동하도록 한다. 이 플래그는 DLL이나 실행 파일 등 공유가 걸린 파일을 교체할 때 주로 사용된다. 이 플래그를 쓰기 위해서는 관리자 계정으로 로긴하거나 로컬 시스템 계정이어야 한다.

MOVEFILE_FAIL_IF_NOT_TRACKABLE

2000이상. 원본 파일이 링크 소스이고 이동 후에 위치를 찾을 수 없을 때 실패한다. 이 상황은 대상 볼륨이 FAT로 포맷되어 있을 때 발생한다.

MOVEFILE_REPLACE_EXISTING

새 파일이 이미 있을 경우 덮어 쓴다. 이 플래그는 파일에 대해서만 사용할 수 있으며 디렉토리에는 적용되지 않는다.

MOVEFILE_WRITE_THROUGH

파일이 실제로 완전히 이동되기 전에는 리턴하지 않는다. 파일 이동 후 이동된 새 파일을 곧바로 사용하고자 할 때는 이 플래그를 사용해야 한다.

 

리턴

성공하면 0이 아닌 값을 리턴하며 실패하면 0을 리턴한다.

설명

MoveFile과 마찬가지로 파일이나 디렉토리를 다른 위치로 옮기되 세부적인 동작에 대해 몇가지 플래그를 지정할 수 있다는 점이 다르다. 특히 재부팅할 때 실제로 파일을 옮겨 주는 기능은 설치 프로그램이 이미 사용중인 DLL을 교체하는 용도로 자주 사용된다. 이 함수는 다음 부팅시 이동할 파일을 레지스트리의 다음 위치에 기록해 놓는다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

이 값은 복수개의 널 종료 문자열로 구성되는 REG_MULTI_SZ 타입으로 되어 있으며 이동 대상이 되는 파일 목록을 가진다. 재부팅할 때 AUTOCHK 후 이 레지스트리에 기록된 대로 파일을 이동시키는데 이 때는 페이징 파일도 생성되기 전이므로 페이징 파일까지도 삭제할 수 있다.

단 재부팅 시 파일 이동은 NT/2000 이상에서만 지원되며 95/98에서는 이 기능을 사용할 수 없다. 대신 WinInit.ini 파일에 이동할 파일이나 디렉토리를 적어주면 되다. 이 파일의 [rename]섹션에 "대상=원본" 형식으로 엔트리를 작성해 놓으면 파일명이 변경된다. 단, 이 동작은 운영체제가 보호 모드로 들어가기 전에 이루어지므로 파일명은 반드시 짧은 이름으로 작성해야 한다. 파일명을 변경한 후 시스템은 WinInit.ini를 WinInit.bak로 변경하여 이 파일을 무효화시킨다.

재부팅시 파일을 교체하는 방법이 운영체제 버전에 따라 상이하므로 GetVersionEx 함수로 운영체제의 버전을 판변한 후 적절한 방법을 사용해야 한다.

참고함수

MoveFileWithProgress : 파일 이동 과정에서 콜백 함수를 호출해 준다.

플랫폼

NT/2000 이상

참조

재부팅할 때 파일을 교체하는 방법에 대해서는 25-1-라절의 ReplaceFile 예제를 참조하기 바란다.


written by http://www.winapi.co.kr