Pregunta

La función API de Windows CopyFile tiene un argumento BOOL bFailIfExists que le permite controlar si desea sobrescribir o no el archivo de destino si existe.

La función boost :: filesystem copy_file no tiene dicho argumento y fallará si existe el archivo de destino. ¿Hay una manera elegante de usar 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 aumentar cuando sea posible para mantener mi plataforma de código independiente.

Gracias.

¿Fue útil?

Solución

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);

Otros consejos

¡Cuidado con boost :: copy_file with 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 bytes de primer tamaño (desde_archivo) en el archivo de destino.

Al menos para mí esto fue una advertencia, ya que supuse que copy_option :: overwrite_if_exists afecta a archivos y no a content

Pruebe si el archivo de destino existe primero y si es así, elimínelo:

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

O si le preocupa que aparezca el archivo entre la prueba y la copia, puede escribir en un archivo temporal y luego cambiarle el nombre al archivo de destino.

  

¿Existe una forma elegante de usar 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 aumentar cuando 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 Normas de C ++. La biblioteca Boost.Filesystem permanecerá 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 de encabezado difieren entre Boost.Filesystem y la propuesta TR2.

Lo que sugiere que seguir con boost :: filesystem es una buena idea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top