comment effectuer boost :: système de fichiers copy_file avec écraser
-
06-07-2019 - |
Question
La fonction API Windows CopyFile
a un argument BOOL bFailIfExists
qui vous permet de contrôler si vous souhaitez ou non écraser le fichier cible s'il existe.
La fonction boost :: système de fichiers
fichier_copie
n'a pas cet argument et échouera si le fichier cible existe. Existe-t-il un moyen élégant 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 booster dans la mesure du possible pour que ma plate-forme de code reste indépendante.
Merci.
La solution
Il existe 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);
Autres conseils
Méfiez-vous de boost :: copy_file avec copy_option :: overwrite_if_exists! Si le fichier de destination existe et qu'il est plus petit que la source, la fonction écrasera uniquement les premiers octets de taille (from_file) du fichier cible.
Du moins pour moi, c'était une mise en garde puisque je supposais que copy_option :: overwrite_if_exists affecte les fichiers et non le contenu
Vérifiez si le fichier de destination existe en premier et s'il le supprime, supprimez-le:
if (exists (to_fp))
remove (to_fp);
copy_file (from_fp, to_fp);
Ou, si le fichier apparaît entre le test et la copie vous inquiète, vous pouvez écrire dans un fichier temporaire, puis le renommer en fichier de destination.
Existe-t-il un moyen élégant 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 vaut-il mieux utiliser simplement l'API Windows? Ma plate-forme cible actuelle est Windows, mais je préfère utiliser STL et booster dans la mesure du possible pour que mon code reste indépendant.
À partir 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 alignée sur la proposition de système de fichiers TR2 tout au long du processus TR2. Notez cependant que la granularité des espaces de noms et de l'en-tête diffère entre Boost.Filesystem et la proposition TR2.
Ce qui suggère fortement que rester avec boost :: système de fichiers
est une bonne idée.