다음을 통해 공유


MoveFileExA 함수(winbase.h)

다양한 이동 옵션을 사용하여 자식을 포함하여 기존 파일 또는 디렉터리를 이동합니다.

MoveFileWithProgress 함수는 moveFileWithProgress 진행률 알림을 받는 콜백 함수를 제공할 수 있다는 점을 제외하고 MoveFileEx 함수와 동일합니다.

이 작업을 트랜잭션 작업으로 수행하려면 MoveFileTransacted 함수를 사용합니다.

통사론

BOOL MoveFileExA(
  [in]           LPCSTR lpExistingFileName,
  [in, optional] LPCSTR lpNewFileName,
  [in]           DWORD  dwFlags
);

매개 변수

[in] lpExistingFileName

로컬 컴퓨터의 파일 또는 디렉터리의 현재 이름입니다.

dwFlagsMOVEFILE_DELAY_UNTIL_REBOOT지정하는 경우 지연된 작업은 네트워크를 사용할 수 있기 전에 수행되므로 원격 공유에 파일이 있을 수 없습니다.

기본적으로 이름은 MAX_PATH 문자로 제한됩니다. 이 제한을 32,767자로 확장하려면 경로 앞에 "\\?\"를 추가합니다. 자세한 내용은 이름 지정 파일, 경로 및 네임스페이스참조하세요.

Windows 10 버전 1607부터 "\\?\" 앞에 추가하지 않고 MAX_PATH 제한을 제거하도록 옵트인할 수 있습니다. 자세한 내용은 명명 파일, 경로 및 네임스페이스의 "최대 경로 길이 제한" 섹션을.

[in, optional] lpNewFileName

로컬 컴퓨터의 파일 또는 디렉터리의 새 이름입니다.

파일을 이동할 때 대상은 다른 파일 시스템 또는 볼륨에 있을 수 있습니다. 대상이 다른 드라이브에 있는 경우 dwFlagsMOVEFILE_COPY_ALLOWED 플래그를 설정해야 합니다.

디렉터리를 이동할 때 대상은 동일한 드라이브에 있어야 합니다.

dwFlags MOVEFILE_DELAY_UNTIL_REBOOT 지정하고 lpNewFileName NULL경우 MoveFileEx 시스템을 다시 시작할 때 삭제할 lpExistingFileName 파일을 등록합니다. lpExistingFileName 디렉터리를 참조하는 경우 시스템은 디렉터리가 비어 있는 경우에만 다시 시작할 때 디렉터리를 제거합니다.

기본적으로 이름은 MAX_PATH 문자로 제한됩니다. 이 제한을 32,767자로 확장하려면 경로 앞에 "\\?\"를 추가합니다. 자세한 내용은 이름 지정 파일, 경로 및 네임스페이스참조하세요.

Windows 10 버전 1607부터 "\\?\" 앞에 추가하지 않고 MAX_PATH 제한을 제거하도록 옵트인할 수 있습니다. 자세한 내용은 명명 파일, 경로 및 네임스페이스의 "최대 경로 길이 제한" 섹션을.

[in] dwFlags

이 매개 변수는 다음 값 중 하나 이상일 수 있습니다.

의미
MOVEFILE_COPY_ALLOWED
2(0x2)
파일을 다른 볼륨으로 이동하려는 경우 함수는 CopyFile 사용하여 이동을 시뮬레이션하고 DeleteFile 함수를 .

파일이 다른 볼륨에 성공적으로 복사되고 원래 파일을 삭제할 수 없는 경우 함수는 원본 파일을 그대로 유지합니다.

이 값은 MOVEFILE_DELAY_UNTIL_REBOOT사용할 수 없습니다.

MOVEFILE_CREATE_HARDLINK
16(0x10)
나중에 사용할 수 있습니다.
MOVEFILE_DELAY_UNTIL_REBOOT
4(0x4)
운영 체제가 다시 시작될 때까지 시스템은 파일을 이동하지 않습니다. 시스템은 AUTOCHK가 실행된 직후에 페이징 파일을 만들기 전에 파일을 이동합니다. 따라서 이 매개 변수를 사용하면 함수가 이전 시작에서 페이징 파일을 삭제할 수 있습니다.

이 값은 프로세스가 관리자 그룹 또는 LocalSystem 계정에 속한 사용자의 컨텍스트에 있는 경우에만 사용할 수 있습니다.

이 값은 MOVEFILE_COPY_ALLOWED사용할 수 없습니다.

MOVEFILE_FAIL_IF_NOT_TRACKABLE
32(0x20)
원본 파일이 링크 원본이지만 이동 후 파일을 추적할 수 없는 경우 함수가 실패합니다. 이 상황은 대상이 FAT 파일 시스템으로 포맷된 볼륨인 경우에 발생할 수 있습니다.
MOVEFILE_REPLACE_EXISTING
1(0x1)
lpNewFileName 파일이 있는 경우 ACL(액세스 제어 목록)에 대한 보안 요구 사항이 충족되는 경우 함수는 해당 내용을 lpExistingFileName 파일의 콘텐츠로 바꿉니다. 자세한 내용은 이 항목의 설명 섹션을 참조하세요.

lpNewFileName 기존 디렉터리의 이름을 지정하면 오류가 보고됩니다.

MOVEFILE_WRITE_THROUGH
8(0x8)
파일이 실제로 디스크에서 이동될 때까지 함수는 반환되지 않습니다.

이 값을 설정하면 함수가 반환되기 전에 복사 및 삭제 작업으로 수행된 이동이 디스크로 플러시됩니다. 복사 작업이 끝날 때 플러시가 발생합니다.

MOVEFILE_DELAY_UNTIL_REBOOT 설정된 경우에는 이 값이 적용되지 않습니다.

반환 값

함수가 성공하면 반환 값은 0이 아닌 값입니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 얻으려면 GetLastError호출합니다.

발언

dwFlags 매개 변수가 MOVEFILE_DELAY_UNTIL_REBOOT지정하면 레지스트리에 액세스할 수 없으면 MoveFileEx 실패합니다. 이 함수는 다시 시작할 때 이름을 바꿀 파일의 위치를 다음 레지스트리 값에 저장합니다. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

이 레지스트리 값은 REG_MULTI_SZ형식입니다. 각 이름 바꾸기 작업은 이름 바꾸기가 삭제인지 여부에 따라 다음 NULL로 끝나는 문자열 중 하나를 저장합니다.

  • szSrcFile\0\0
  • szSrcFile\0szDstFile\0
문자열 szSrcFile\0\0은 다시 부팅 시 szSrcFile 파일을 삭제할 나타냅니다. szSrcFile szSrcFile\0szDstFile\0은 다시 부팅 시 szDstFile szSrcFile 이름을 바꾸도록 나타냅니다.
참고 \0\0은 기술적으로 REG_MULTI_SZ 노드에서 허용되지 않지만 파일이 null 이름으로 이름이 바뀐 것으로 간주되기 때문일 수 있습니다.
 
시스템은 이러한 레지스트리 항목을 사용하여 다시 시작할 때 발급된 순서와 동일한 순서로 작업을 완료합니다. 예를 들어 다음 코드 조각은 szSrcFile 삭제하고 szSrcFile 이름을 다시 시작할 때 szDstFile 이름을 바꾸는 레지스트리 항목을 만듭니다.
MoveFileEx(szSrcFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);

호출 애플리케이션의 실행이 중단된 후 MOVEFILE_DELAY_UNTIL_REBOOT 플래그로 지정된 실제 이동 및 삭제 작업이 수행되므로 반환 값은 파일 이동 또는 삭제의 성공 또는 실패를 반영할 수 없습니다. 대신 레지스트리에 적절한 항목을 배치하는 데 성공 또는 실패가 반영됩니다.

시스템은 비어 있는 경우에만 MOVEFILE_DELAY_UNTIL_REBOOT 플래그를 사용하여 삭제할 수 있도록 태그가 지정된 디렉터리를 삭제합니다. 디렉터리를 삭제하려면 디렉터리를 삭제하기 전에 디렉터리에서 모든 파일을 이동하거나 삭제합니다. 파일이 부팅 시 디렉터리에 있을 수 있지만 시스템에서 디렉터리를 삭제하려면 먼저 파일을 삭제하거나 이동해야 합니다.

이동 및 삭제 작업은 호출 애플리케이션에 지정된 순서대로 부팅 시 수행됩니다. 부팅 시 파일이 있는 디렉터리를 삭제하려면 먼저 파일을 삭제합니다.

파일이 볼륨 간에 이동되는 경우 MoveFileEx 파일과 함께 보안 설명자를 이동하지 않습니다. 파일에 대상 디렉터리의 기본 보안 설명자가 할당됩니다.

MoveFileEx 함수는 링크 추적 서비스와 작업을 조정하므로 이동될 때 링크 원본을 추적할 수 있습니다.

파일을 삭제하거나 이름을 바꾸려면 파일에 대한 삭제 권한이 있거나 부모 디렉터리에서 자식 권한을 삭제해야 합니다. 자식 삭제 및 삭제를 제외한 모든 액세스 권한이 있는 디렉터리를 설정하고 새 파일의 ACL을 상속하는 경우 파일을 삭제하지 않고도 파일을 만들 수 있어야 합니다. 그러나 파일을 만들고 파일을 만들 때 반환되는 핸들에 대해 요청하는 모든 액세스 권한을 가져올 수 있습니다. 파일을 만들 때 삭제 권한을 요청하는 경우 해당 핸들을 사용하지만 다른 핸들은 사용하지 않고 파일을 삭제하거나 이름을 바꿀 수 있습니다. 자세한 내용은 파일 보안 및 액세스 권한참조하세요.

Windows 8 및 Windows Server 2012에서 이 함수는 다음 기술에서 지원됩니다.

기술 지원
SMB(서버 메시지 블록) 3.0 프로토콜
SMB 3.0 TFO(투명한 장애 조치(failover)
SO(스케일 아웃 파일 공유)가 있는 SMB 3.0
CsvFS(클러스터 공유 볼륨 파일 시스템)
ReFS(복원 파일 시스템)
 

예제

예제는 임시 파일만들기 및 사용 참조하세요.

요구 사항

요구
지원되는 최소 클라이언트 Windows XP [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winbase.h(Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

copyFile

DeleteFile

파일 관리 함수

파일 보안 및 액세스 권한

GetWindowsDirectory

moveFileTransacted

moveFileWithProgress

writePrivateProfileString