std::filesystem:: copy
|
Definiert im Header
<filesystem>
|
||
|
void
copy
(
const
std::
filesystem
::
path
&
from,
const std:: filesystem :: path & to ) ; |
(1) | (seit C++17) |
|
void
copy
(
const
std::
filesystem
::
path
&
from,
const
std::
filesystem
::
path
&
to,
|
(2) | (seit C++17) |
|
void
copy
(
const
std::
filesystem
::
path
&
from,
const
std::
filesystem
::
path
&
to,
|
(3) | (seit C++17) |
|
void
copy
(
const
std::
filesystem
::
path
&
from,
const
std::
filesystem
::
path
&
to,
|
(4) | (seit C++17) |
Kopiert Dateien und Verzeichnisse mit verschiedenen Optionen.
copy_options::none
verwendet als
options
.
copy_file
-Gruppe).
Das Verhalten ist wie folgt:
- Zuerst, bevor irgendetwas anderes gemacht wird, ermittelt Typ und Berechtigungen von from durch nicht mehr als einen einzigen Aufruf von
-
-
std::filesystem::symlink_status
, falls
copy_options::skip_symlinks,copy_options::copy_symlinks, odercopy_options::create_symlinksin options vorhanden ist; - std::filesystem::status sonst.
-
std::filesystem::symlink_status
, falls
- Falls erforderlich, erhält den Status von to , durch nicht mehr als einen einzigen Aufruf von
-
-
std::filesystem::symlink_status
, falls
copy_options::skip_symlinksodercopy_options::create_symlinksin options vorhanden ist; -
std::filesystem::status
andernfalls (einschließlich des Falls, in dem
copy_options::copy_symlinksin options vorhanden ist).
-
std::filesystem::symlink_status
, falls
- Wenn entweder from oder to einen implementierungsdefinierten Dateityp hat, sind die Auswirkungen dieser Funktion implementierungsdefiniert.
- Wenn from nicht existiert, wird ein Fehler gemeldet.
- Wenn from und to dieselbe Datei sind, wie durch std::filesystem::equivalent bestimmt, wird ein Fehler gemeldet.
- Wenn entweder from oder to keine reguläre Datei, kein Verzeichnis und keine symbolische Verknüpfung ist, wie durch std::filesystem::is_other bestimmt, wird ein Fehler gemeldet.
- Wenn from ein Verzeichnis ist, aber to eine reguläre Datei ist, wird ein Fehler gemeldet.
- Wenn from eine symbolische Verknüpfung ist, dann
-
-
Wenn
copy_options::skip_symlinkin options vorhanden ist, tut nichts. -
Andernfalls, wenn
to
nicht existiert und
copy_options::copy_symlinksin options vorhanden ist, verhält sich wie copy_symlink ( from, to ) . - Andernfalls wird ein Fehler gemeldet.
-
Wenn
- Andernfalls, wenn from eine reguläre Datei ist, dann
-
-
Wenn
copy_options::directories_onlyin options vorhanden ist, wird nichts unternommen. -
Andernfalls, wenn
copy_options::create_symlinksin options vorhanden ist, wird eine symbolische Verknüpfung zu to erstellt. Hinweis: from muss ein absoluter Pfad sein, es sei denn, to befindet sich im aktuellen Verzeichnis. -
Andernfalls, wenn
copy_options::create_hard_linksin options vorhanden ist, wird eine feste Verknüpfung zu to erstellt. - Andernfalls, wenn to ein Verzeichnis ist, verhält es sich wie copy_file ( from, to / from. filename ( ) , options ) (erstellt eine Kopie von from als Datei im Verzeichnis to ).
- Andernfalls verhält es sich wie copy_file ( from, to, options ) (kopiert die Datei).
-
Wenn
-
Andernfalls, falls
from
ein Verzeichnis ist und
copy_options::create_symlinksin options gesetzt ist, wird ein Fehler mit einem Fehlercode gleich std:: make_error_code ( std:: errc :: is_a_directory ) gemeldet. -
Andernfalls, falls
from
ein Verzeichnis ist und entweder
options
copy_options::recursiveenthält odercopy_options::noneist,
-
- Falls to nicht existiert, wird zuerst create_directory ( to, from ) ausgeführt (erstellt das neue Verzeichnis mit einer Kopie der Attribute des alten Verzeichnisses).
-
Dann, unabhängig davon ob
to
bereits existierte oder gerade erstellt wurde, iteriert über die in
from
enthaltenen Dateien, als ob durch
for
(
const
std::
filesystem
::
directory_entry
&
x
:
std::
filesystem
::
directory_iterator
(
from
)
)
, und ruft für jeden Verzeichniseintrag rekursiv
copy
(
x.
path
(
)
, to
/
x.
path
(
)
.
filename
(
)
, options
|
in
-
recursive
-
copy
)
auf, wobei
in-recursive-copy
ein spezielles Bit ist, das keine andere Wirkung hat, wenn es in
options
gesetzt ist. (Der einzige Zweck der Setzung dieses Bits ist, rekursives Kopieren von Unterverzeichnissen zu verhindern, falls
options
gleich
copy_options::noneist.)
- Andernfalls tut nichts.
Inhaltsverzeichnis |
Parameter
| from | - | Pfad zur Quelldatei, zum Verzeichnis oder zur symbolischen Verknüpfung |
| to | - | Pfad zur Zieldatei, zum Verzeichnis oder zur symbolischen Verknüpfung |
| ec | - | Out-Parameter für Fehlerberichterstattung in der nicht-werfenden Überladung |
Rückgabewert
(keine)
Ausnahmen
Jede Überladung, die nicht als
noexcept
gekennzeichnet ist, kann
std::bad_alloc
auslösen, wenn die Speicherallokation fehlschlägt.
Hinweise
Das Standardverhalten beim Kopieren von Verzeichnissen ist das nicht-rekursive Kopieren: Die Dateien werden kopiert, aber nicht die Unterverzeichnisse:
// Gegeben // /dir1 enthält /dir1/file1, /dir1/file2, /dir1/dir2 // und /dir1/dir2 enthält /dir1/dir2/file3 // Nach std::filesystem::copy("/dir1", "/dir3"); // /dir3 wird erstellt (mit den Attributen von /dir1) // /dir1/file1 wird nach /dir3/file1 kopiert // /dir1/file2 wird nach /dir3/file2 kopiert
Während mit
copy_options::recursive
die Unterverzeichnisse ebenfalls kopiert werden, inklusive ihres Inhalts, rekursiv.
// ...aber nach std::filesystem::copy("/dir1", "/dir3", std::filesystem::copy_options::recursive); // /dir3 wird erstellt (mit den Attributen von /dir1) // /dir1/file1 wird nach /dir3/file1 kopiert // /dir1/file2 wird nach /dir3/file2 kopiert // /dir3/dir2 wird erstellt (mit den Attributen von /dir1/dir2) // /dir1/dir2/file3 wird nach /dir3/dir2/file3 kopiert
Beispiel
#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"); // Datei kopieren fs::copy("sandbox/dir", "sandbox/dir2"); // Verzeichnis kopieren (nicht rekursiv) 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"); }
Mögliche Ausgabe:
.
├── sandbox
│ ├── dir
│ │ └── subdir
│ ├── dir2
│ ├── file1.txt
│ └── file2.txt
└── sandbox_copy
├── dir
│ └── subdir
└── dir2
8 Verzeichnisse, 2 Dateien
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3013 | C++17 |
error_code
Überladung als noexcept markiert, kann aber Speicher allozieren
|
noexcept entfernt |
| LWG 2682 | C++17 | Versuch, einen Symlink für ein Verzeichnis zu erstellen, gelingt, tut aber nichts | meldet einen Fehler |
Siehe auch
|
(C++17)
|
legt die Semantik von Kopiervorgängen fest
(enum) |
|
(C++17)
|
kopiert einen symbolischen Link
(function) |
|
(C++17)
|
kopiert Dateiinhalte
(function) |