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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top