Namespaces
Variants

std::filesystem:: copy

From cppreference.net
헤더 파일에 정의됨 <filesystem>
void copy ( const std:: filesystem :: path & from,
const std:: filesystem :: path & to ) ;
(1) (C++17부터)
(2) (C++17부터)
(3) (C++17부터)
(4) (C++17부터)

파일과 디렉터리를 다양한 옵션과 함께 복사합니다.

1,2) 기본값으로, (3,4) 와 동일하며 copy_options::none options 로 사용됩니다.
3,4) 파일 또는 디렉토리를 from 에서 파일 또는 디렉토리 to 로 복사하며, options 에 지정된 복사 옵션을 사용합니다. options copy_options 옵션 그룹 중 어느 하나에 두 개 이상의 옵션이 존재하는 경우( copy_file 그룹 포함) 동작은 정의되지 않습니다.

동작은 다음과 같습니다:

  • 우선, 다른 어떤 작업을 하기 전에, 최대 한 번의 호출로 from 의 타입과 권한을 획득합니다.
  • 필요한 경우, to 의 상태를 얻으며, 단 한 번의 호출을 초과하지 않습니다
  • from 또는 to 중 하나가 구현 정의된 파일 유형 을 가지는 경우, 이 함수의 동작은 구현 정의됩니다.
  • from 이 존재하지 않으면 오류를 보고합니다.
  • from to std::filesystem::equivalent 으로 결정된 동일한 파일인 경우 오류를 보고합니다.
  • from 또는 to 중 하나가 std::filesystem::is_other 으로 결정된 일반 파일, 디렉토리 또는 심볼릭 링크가 아닌 경우 오류를 보고합니다.
  • from 이 디렉토리이지만 to 가 일반 파일인 경우 오류를 보고합니다.
  • from 이 심볼릭 링크인 경우
  • 만약 copy_options::skip_symlink options 에 존재하면, 아무 작업도 수행하지 않습니다.
  • 그렇지 않고 만약 to 가 존재하지 않으며 copy_options::copy_symlinks options 에 존재하면, copy_symlink ( from, to ) 와 같이 동작합니다.
  • 그렇지 않으면, 오류를 보고합니다.
  • 그렇지 않고 from 이 일반 파일인 경우,
  • 만약 copy_options::directories_only options 에 존재하면, 아무 작업도 수행하지 않습니다.
  • 그렇지 않고 만약 copy_options::create_symlinks options 에 존재하면, to 에 대한 심볼릭 링크를 생성합니다. 참고: from 은 절대 경로여야 하며, to 가 현재 디렉터리에 있는 경우는 예외입니다.
  • 그렇지 않고 만약 copy_options::create_hard_links options 에 존재하면, to 에 대한 하드 링크를 생성합니다.
  • 그렇지 않고 만약 to 가 디렉터리라면, copy_file ( from, to / from. filename ( ) , options ) 와 같이 동작합니다 ( from 의 사본을 to 디렉터리 내 파일로 생성합니다).
  • 그렇지 않으면, copy_file ( from, to, options ) 와 같이 동작합니다 (파일을 복사합니다).
  • 그렇지 않고, from 이 디렉터리이며 copy_options::create_symlinks options 에 설정된 경우, std:: make_error_code ( std:: errc :: is_a_directory ) 와 동일한 오류 코드로 오류를 보고합니다.
  • 그렇지 않고, from 이 디렉터리이며 options copy_options::recursive 가 설정되었거나 copy_options::none 인 경우,
  • 만약 to 가 존재하지 않으면, 먼저 create_directory ( to, from ) 를 실행합니다 (이전 디렉토리의 속성을 복사하여 새 디렉토리를 생성합니다).
  • 그런 다음, to 가 이미 존재했든 방금 생성되었든, for ( const std:: filesystem :: directory_entry & x : std:: filesystem :: directory_iterator ( from ) ) 와 같이 from 에 포함된 파일들을 순회하며 각 디렉토리 엔트리에 대해 재귀적으로 copy ( x. path ( ) , to / x. path ( ) . filename ( ) , options | in - recursive - copy ) 를 호출합니다. 여기서 in-recursive-copy options 에 설정되었을 때 다른 효과가 없는 특수 비트입니다. (이 비트를 설정하는 유일한 목적은 options copy_options::none 인 경우 재귀적 하위 디렉토리 복사를 방지하는 것입니다.)
  • 그 외의 경우 아무 작업도 수행하지 않습니다.

목차

매개변수

from - 소스 파일, 디렉터리 또는 심링크의 경로
to - 대상 파일, 디렉터리 또는 심링크의 경로
ec - 비예외 발생 오버로드에서 오류 보고를 위한 출력 매개변수

반환값

(없음)

예외

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

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

참고 사항

디렉토리 복사의 기본 동작은 비재귀적 복사입니다: 파일들은 복사되지만 하위 디렉토리들은 복사되지 않습니다:

// 주어진 조건
// /dir1은 /dir1/file1, /dir1/file2, /dir1/dir2를 포함
// 그리고 /dir1/dir2는 /dir1/dir2/file3을 포함
// 실행 후
std::filesystem::copy("/dir1", "/dir3");
// /dir3이 생성됨 (/dir1의 속성과 함께)
// /dir1/file1이 /dir3/file1로 복사됨
// /dir1/file2가 /dir3/file2로 복사됨

copy_options::recursive 를 사용하는 동안에는 하위 디렉터리도 해당 내용과 함께 재귀적으로 복사됩니다.

// ...하지만 이후에
std::filesystem::copy("/dir1", "/dir3", std::filesystem::copy_options::recursive);
// /dir3이 생성됨 (/dir1의 속성과 함께)
// /dir1/file1이 /dir3/file1로 복사됨
// /dir1/file2가 /dir3/file2로 복사됨
// /dir3/dir2가 생성됨 (/dir1/dir2의 속성과 함께)
// /dir1/dir2/file3이 /dir3/dir2/file3로 복사됨

예제

#include <cstdlib>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    fs::create_directories("sandbox/dir/subdir");
    std::ofstream("sandbox/file1.txt").put('a');
    fs::copy("sandbox/file1.txt", "sandbox/file2.txt"); // 파일 복사
    fs::copy("sandbox/dir", "sandbox/dir2"); // 디렉토리 복사 (비재귀적)
    const auto copyOptions = fs::copy_options::update_existing
                           | fs::copy_options::recursive
                           | fs::copy_options::directories_only
                           ;
    fs::copy("sandbox", "sandbox_copy", copyOptions); 
    static_cast<void>(std::system("tree"));
    fs::remove_all("sandbox");
    fs::remove_all("sandbox_copy");
}

가능한 출력:

.
├── sandbox
│   ├── dir
│   │   └── subdir
│   ├── dir2
│   ├── file1.txt
│   └── file2.txt
└── sandbox_copy
    ├── dir
    │   └── subdir
    └── dir2
8 directories, 2 files

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 수정된 동작
LWG 3013 C++17 error_code 오버로드가 noexcept로 표시되었으나 메모리 할당 가능 noexcept 제거됨
LWG 2682 C++17 디렉터리에 대한 심볼릭 링크 생성 시도 시 성공하나 아무 동작 안 함 오류 보고

참고 항목

복사 작업의 의미론을 지정함
(열거형)
심볼릭 링크를 복사함
(함수)
(C++17)
파일 내용을 복사함
(함수)