web-dev-qa-db-fra.com

comment effectuer boost :: filesystem copy_file avec écraser

La fonction API Windows CopyFile a un argument BOOL bFailIfExists Qui vous permet de contrôler si vous souhaitez ou non remplacer le fichier cible s'il existe.

La fonction boost::filesystemcopy_file N'a pas un tel argument et échouera si le fichier cible existe. Existe-t-il une manière élégante d'utiliser la fonction boost copy_file et d'écraser le fichier cible? Ou est-il préférable d'utiliser simplement l'API Windows? Ma plate-forme cible actuelle est Windows, mais je préfère utiliser STL et augmenter si possible pour garder ma plate-forme de code indépendante.

Je vous remercie.

41

Il y a un troisième enum argument pour copy_file, boost :: filesystem :: copy_option :: overwrite_if_exists

copy_file(source_path,destination_path,copy_option::overwrite_if_exists);
64
anno

Méfiez-vous de boost :: copy_file avec copy_option :: overwrite_if_exists! Si le fichier de destination existe et est plus petit que la source, la fonction n'écrasera que les premiers octets de taille (from_file) dans le fichier cible.

Au moins pour moi, c'était une mise en garde car je présumais que copy_option :: overwrite_if_exists affecte fichiers et non content

18
Vitaly P

Testez si le fichier de destination existe en premier et s'il le fait, supprimez-le ensuite:

if (exists (to_fp))
    remove (to_fp);
copy_file (from_fp, to_fp);

Ou si vous craignez que le fichier apparaisse entre le test et la copie, vous pouvez écrire dans un fichier temporaire, puis le renommer en fichier de destination.

9
jon-hanson

Existe-t-il une manière élégante d'utiliser la fonction boost copy_file et d'écraser le fichier cible?

Apparemment, il n'y a pas d'API directe pour le faire.

Ou est-il préférable d'utiliser simplement l'API Windows? Ma plate-forme cible actuelle est Windows, mais je préfère utiliser STL et augmenter si possible pour garder ma plate-forme de code indépendante.

De la documentation:

Une proposition, N1975, visant à inclure Boost.Filesystem dans le rapport technique 2 a été acceptée par le Comité des normes C++. La bibliothèque Boost.Filesystem restera en alignement avec la proposition de système de fichiers TR2 tout au long du processus TR2. Notez, cependant, que les espaces de noms et la granularité de l'en-tête diffèrent entre Boost.Filesystem et la proposition TR2.

Ce qui suggère fortement que s'en tenir à boost::filesystem est une bonne idée.

2
dirkgently