std::filesystem:: copy
|
헤더 파일에 정의됨
<filesystem>
|
||
|
void
copy
(
const
std::
filesystem
::
path
&
from,
const std:: filesystem :: path & to ) ; |
(1) | (C++17부터) |
|
void
copy
(
const
std::
filesystem
::
path
&
from,
const
std::
filesystem
::
path
&
to,
|
(2) | (C++17부터) |
|
void
copy
(
const
std::
filesystem
::
path
&
from,
const
std::
filesystem
::
path
&
to,
|
(3) | (C++17부터) |
|
void
copy
(
const
std::
filesystem
::
path
&
from,
const
std::
filesystem
::
path
&
to,
|
(4) | (C++17부터) |
파일과 디렉터리를 다양한 옵션과 함께 복사합니다.
copy_options::none
가
options
로 사용됩니다.
copy_file
그룹 포함) 동작은 정의되지 않습니다.
동작은 다음과 같습니다:
- 우선, 다른 어떤 작업을 하기 전에, 최대 한 번의 호출로 from 의 타입과 권한을 획득합니다.
-
-
std::filesystem::symlink_status
, 만약
copy_options::skip_symlinks,copy_options::copy_symlinks, 또는copy_options::create_symlinks가 options 에 존재하는 경우; - std::filesystem::status 그 외의 경우.
-
std::filesystem::symlink_status
, 만약
- 필요한 경우, to 의 상태를 얻으며, 단 한 번의 호출을 초과하지 않습니다
-
-
std::filesystem::symlink_status
, 만약
copy_options::skip_symlinks또는copy_options::create_symlinks가 options 에 존재하는 경우; -
std::filesystem::status
그 외의 경우 (
copy_options::copy_symlinks가 options 에 존재하는 경우도 포함).
-
std::filesystem::symlink_status
, 만약
- 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할 수 있습니다.
참고 사항
디렉토리 복사의 기본 동작은 비재귀적 복사입니다: 파일들은 복사되지만 하위 디렉토리들은 복사되지 않습니다:
// 주어진 조건 // /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)
|
복사 작업의 의미론을 지정함
(열거형) |
|
(C++17)
|
심볼릭 링크를 복사함
(함수) |
|
(C++17)
|
파일 내용을 복사함
(함수) |