Namespaces
Variants

std::filesystem:: rename

From cppreference.net
헤더 파일에 정의됨 <filesystem>
void rename ( const std:: filesystem :: path & old_p,
const std:: filesystem :: path & new_p ) ;
(1) (C++17부터)
void rename ( const std:: filesystem :: path & old_p,

const std:: filesystem :: path & new_p,

std:: error_code & ec ) noexcept ;
(2) (C++17부터)

old_p 로 식별된 파일 시스템 객체를 new_p 로 이동하거나 이름을 변경합니다. 이 작업은 POSIX rename 함수와 동일한 방식으로 수행됩니다:

  • 만약 old_p 이 비-디렉터리 파일이라면, new_p 는 다음 중 하나여야 합니다:
  • old_p 와 동일한 파일이거나 하드 링크인 경우: 이 경우 아무 작업도 수행되지 않습니다.
  • 기존 비디렉터리 파일: new_p 가 먼저 삭제된 후, 다른 프로세스가 new_p 가 삭제된 것을 관찰하지 못하도록 하면서 경로명 new_p 가 파일에 연결되고 old_p 는 파일에서 연결 해제됩니다. old_p 를 포함하는 디렉터리와 new_p 를 포함하는 디렉터리 모두에 쓰기 권한이 필요합니다.
  • 기존 디렉터리 내 존재하지 않는 파일: 경로명 new_p 가 파일에 연결되고 old_p 는 파일에서 연결 해제됩니다. old_p 를 포함하는 디렉터리와 new_p 를 포함하는 디렉터리 모두에 쓰기 권한이 필요합니다.
  • 만약 old_p 가 디렉토리라면, new_p 는 다음 중 하나여야 합니다:
  • old_p 와 동일한 디렉터리이거나 하드 링크인 경우: 이 경우 아무 작업도 수행되지 않습니다.
  • 기존 디렉터리인 경우: new_p 는 POSIX 시스템에서 비어 있을 경우 삭제되지만, 다른 시스템에서는 오류가 발생할 수 있습니다. 오류가 아닌 경우, new_p 가 먼저 삭제된 후, 다른 프로세스가 new_p 가 삭제된 것을 관찰하지 못하도록 경로명 new_p 가 디렉터리에 연결되고 old_p 가 디렉터리에서 연결 해제됩니다. old_p 를 포함하는 디렉터리와 new_p 를 포함하는 디렉터리 모두에 쓰기 권한이 필요합니다.
  • 존재하지 않는 디렉터리로, 디렉터리 구분자로 끝나지 않으며 상위 디렉터리가 존재하는 경우: 경로명 new_p 가 디렉터리에 연결되고 old_p 가 디렉터리에서 연결 해제됩니다. old_p 를 포함하는 디렉터리와 new_p 를 포함하는 디렉터리 모두에 쓰기 권한이 필요합니다.
  • 심링크는 따르지 않음: 만약 old_p 가 심링크인 경우, 그 대상이 아닌 심링크 자체가 이름 변경됩니다. 만약 new_p 가 기존 심링크인 경우, 그 대상이 아닌 심링크 자체가 삭제됩니다.

이름 바꾸기가 실패하는 경우:

  • new_p dot 또는 dot-dot 으로 끝나는 경우.
  • new_p 가 디렉토리 구분자로 끝나는 존재하지 않는 디렉토리를 지정하는 경우.
  • old_p new_p 의 상위 디렉토리인 경우.

목차

매개변수

old_p - 이동하거나 이름을 변경할 경로
new_p - 이동/이름 변경 작업의 대상 경로
ec - 비예외 발생 오버로드에서 오류 보고를 위한 출력 매개변수

반환값

(없음)

예외

noexcept 로 표시되지 않은 모든 오버로드는 메모리 할당이 실패할 경우 std::bad_alloc 을(를) throw할 수 있습니다.

1) 기본 OS API 오류 발생 시 std::filesystem::filesystem_error 를 발생시킵니다. 이는 old_p 를 첫 번째 경로 인수로, new_p 를 두 번째 경로 인수로, OS 오류 코드를 오류 코드 인수로 사용하여 구성됩니다.
2) OS API 호출이 실패할 경우 std:: error_code & 매개변수를 OS API 오류 코드로 설정하고, 오류가 발생하지 않을 경우 ec. clear ( ) 를 실행합니다.

예제

#include <filesystem>
#include <fstream>
namespace fs = std::filesystem;
int main()
{
    std::filesystem::path p = std::filesystem::current_path() / "sandbox";
    std::filesystem::create_directories(p / "from");
    std::ofstream{ p / "from/file1.txt" }.put('a');
    std::filesystem::create_directory(p / "to");
//  fs::rename(p / "from/file1.txt", p / "to/"); // 오류: "to"는 디렉토리입니다
    fs::rename(p / "from/file1.txt", p / "to/file2.txt"); // 정상
//  fs::rename(p / "from", p / "to"); // 오류: "to"가 비어 있지 않습니다
    fs::rename(p / "from", p / "to/subdir"); // 정상
    std::filesystem::remove_all(p);
}

참고 항목

파일 이름 변경
(함수)
(C++17) (C++17)
파일 또는 빈 디렉토리 삭제
파일 또는 디렉토리와 모든 내용을 재귀적으로 삭제
(함수)