30 Input/output library [input.output]

30.10 File systems [filesystems]

30.10.34 Filesystem operation functions [fs.op.funcs]

30.10.34.3 Copy [fs.op.copy]

void copy(const path& from, const path& to);

Effects: Эквивалентно copy(from, to, copy_­options​::​none).

void copy(const path& from, const path& to, error_code& ec) noexcept;

Effects: Эквивалентно copy(from, to, copy_­options​::​none, ec).

void copy(const path& from, const path& to, copy_options options); void copy(const path& from, const path& to, copy_options options, error_code& ec) noexcept;

Requires: [fs.enum.copy.opts]Устанавливается не более одного элемента из каждой группы опций ( ) options.

Effects: Перед первым применением f и t:

  • Если

    (options & copy_options::create_symlinks) != copy_options::none ||
    (options & copy_options::skip_symlinks) != copy_options::none

    тогда auto f = symlink_­status(from) и при необходимости auto t = symlink_­status(to).

  • В противном случае, если

    (options & copy_options::copy_symlinks) != copy_options::none

    тогда auto f = symlink_­status(from) и при необходимости auto t = status(to).

  • В противном случае auto f = status(from) и при необходимости auto t = status(to).

Эффекты тогда следующие:

  • Если f.type() или t.type() является типом файла, определяемым реализацией ([fs.enum.file_type]), то эффекты определяются реализацией.

  • В противном случае сообщается об ошибке, как указано в [fs.err.report] if:

    • !exists(f), или

    • equivalent(from, to), или

    • is_­other(f) || is_­other(t), или

    • is_­directory(f) && is_­regular_­file(t).

  • В противном случае, если is_­symlink(f), то:

    • Если (options & copy_­options​::​skip_­symlinks) != copy_­options​::​none потом вернемся.

    • В противном случае, если

      !exists(t) && (options & copy_options::copy_symlinks) != copy_options::none

      тогда copy_­symlink(from, to).

    • В противном случае сообщите об ошибке, как указано в [fs.err.report].

  • В противном случае, если is_­regular_­file(f), то:

    • Если (options & copy_­options​::​directories_­only) != copy_­options​::​none, то вернись.

    • В противном случае, если (options & copy_­options​::​create_­symlinks) != copy_­options​::​none, то создайте символическую ссылку на исходный файл.

    • В противном случае, если (options & copy_­options​::​create_­hard_­links) != copy_­options​::​none, то создайте жесткую ссылку на исходный файл.

    • Иначе если is_­directory(t), то copy_­file(from, to/from.filename(), options).

    • В противном случае copy_­file(from, to, options).

  • В противном случае, если

    is_directory(f) &&
    ((options & copy_options::recursive) != copy_options::none ||
     options == copy_options::none)

    тогда:

    • Если !exists(t), то create_­directory(to, from).

    • Затем перейдите по файлам from, как если бы

      for (const directory_entry& x : directory_iterator(from))
        copy(x.path(), to/x.path().filename(), options | copy_options::unspecified)
  • В противном случае, для подписи с аргументом ec, ec.clear().

  • В остальном никаких эффектов.

Throws: Как указано в [fs.err.report].

Remarks: Для подписи с аргументом ecлюбые библиотечные функции, вызываемые реализацией, должны иметь error_­code аргумент, если это применимо.

[ Example: Учитывая эту структуру каталогов:

/dir1
  file1
  file2
  dir2
    file3

Вызов copy("/dir1", "/dir3") приведет к:

/dir1
  file1
  file2
  dir2
    file3
/dir3
  file1
  file2

В качестве альтернативы вызов copy("/dir1", "/dir3", copy_­options​::​recursive) может привести к:

/dir1
  file1
  file2
  dir2
    file3
/dir3
  file1
  file2
  dir2
    file3

end example]