c++ - not - mv overwrite without asking
cómo realizar boost:: filesystem copy_file con sobrescribir (4)
La función de API de Windows CopyFile
tiene un argumento BOOL bFailIfExists
que le permite controlar si desea sobrescribir el archivo de destino si existe.
La función boost::filesystem
copy_file
no tiene ese argumento, y fallará si el archivo de destino existe. ¿Existe alguna forma elegante de utilizar la función boost copy_file y sobrescribir el archivo de destino? ¿O es mejor simplemente usar la API de Windows? Mi plataforma objetivo actual es Windows, pero prefiero usar STL y potenciar, donde sea posible, para mantener mi plataforma de código independiente.
Gracias.
¿Existe alguna forma elegante de utilizar la función boost copy_file y sobrescribir el archivo de destino?
Aparentemente no hay una API directa para hacer esto.
¿O es mejor simplemente usar la API de Windows? Mi plataforma objetivo actual es Windows, pero prefiero usar STL y potenciar, donde sea posible, para mantener mi plataforma de código independiente.
De la documentación:
Una propuesta, N1975, para incluir Boost.Filesystem en el Informe técnico 2 ha sido aceptada por el Comité de estándares de C ++. La biblioteca Boost.Filesystem se mantendrá alineada con la propuesta del sistema de archivos TR2 a medida que avanza en el proceso TR2. Sin embargo, tenga en cuenta que los espacios de nombres y la granularidad del encabezado difieren entre Boost.Filesystem y la propuesta TR2.
Lo que sugiere fuertemente que seguir con boost::filesystem
es una buena idea.
¡Cuidado con boost :: copy_file con copy_option :: overwrite_if_exists! Si el archivo de destino existe y es más pequeño que el origen, la función solo sobrescribirá los primeros bytes de tamaño (from_file) en el archivo de destino.
Al menos para mí, esto era una advertencia ya que suponía que copy_option :: overwrite_if_exists afecta a los archivos y no al contenido
Hay un tercer argumento enum para copy_file, boost :: filesystem :: copy_option :: overwrite_if_exists
copy_file(source_path,destination_path,copy_option::overwrite_if_exists);
Pruebe si el archivo de destino existe primero y, en caso afirmativo, elimínelo:
if (exists (to_fp))
remove (to_fp);
copy_file (from_fp, to_fp);
O si le preocupa que el archivo aparezca entre la prueba y la copia, puede escribir en un archivo temporal y luego cambiarle el nombre al archivo de destino.