txt sistema manejo lenguaje leer guardar funciona ejercicios datos como archivos archivo c++ c++11 c++17 c++-standard-library boost-filesystem

manejo - ¿Qué tan similares son el sistema de archivos Boost y las bibliotecas estándar del sistema de archivos C++?



manejo de archivos en c pdf (2)

Necesito una biblioteca de sistema de archivos para usar con un compilador compatible con C ++ 11 o uno compatible con C ++ 14, por lo que no puede ser de C ++ 17.

Ahora, sé que la biblioteca del sistema de archivos que va a C ++ 17 se basa en Boost :: Filesystem; pero, ¿son lo suficientemente similares para que yo use la biblioteca Boost y luego cambie sin problemas a la versión estándar en un momento posterior, sin cambiar más que, digamos, una declaración de using ? ¿O hay diferencias (menores / significativas) entre los dos? Sé que para el caso de la variant , las versiones de Boost y de la biblioteca estándar difieren bastante.


Hay una serie de diferencias. Algunos fueron, creo, cambios de Boost que nunca se propagaron. Por ejemplo, no hay ninguna consulta path.filename_is_dot() (como se explica a continuación, sería menos útil en std::filesystem ).

También hubo una buena noticia de última hora en este frente:

  1. Soporte para sistemas de archivos que no son POSIX :
    • Especifique si una cadena es nativa del SO o similar a POSIX (o deje que la implementación decida, que es (aún) el valor predeterminado)
    • Una implementación puede definir tipos de archivos adicionales (más allá del ordinario, directorio, socket, etc. )
    • Una implementación puede definir file_size para un directorio o un archivo de dispositivo
  2. filename() , normalización y conversiones relativas / absolutas redefinidas (ejemplos para POSIX):
    • path("foo/.").lexically_normal()=="foo/" (es lo contrario en Boost)
    • path("foo/").filename()=="" (es path(".") en Boost)
    • remove_filename() deja la barra diagonal final y, por lo tanto, es idempotente (asigna parent_path() en Boost)
    • path(".profile").extension()=="" (es el nombre completo en Boost)
    • path descomposiciones y combinaciones de path pueden conservar cosas como nombres de flujos de datos alternativos que normalmente son invisibles
    • path("foo")/"/bar"=="/bar" (es path("foo/bar") en Boost), que permite componer nombres de archivos relativos con otros (absoluto o relativo) y reemplaza a absolute() de Boost absolute()
    • El system_complete() Boost (que toma solo un argumento) cambia su nombre a absolute()
    • canonical() tanto toma solo un argumento (fijado en un DR )
    • lexically_relative() maneja .. y los elementos raíz correctamente
    • permissions() toma más argumentos (Boost los combina en una máscara de bits)

Tenga en cuenta que Boost.Filesystem v4 está en desarrollo y se supone que es compatible con C ++ 17 (pero, por lo tanto, incompatible en muchos aspectos con v3).


Advertencia: esta respuesta no refleja varios cambios de última hora antes de que se completara C ++ 17. Ver la respuesta de @ DavisHerring.

El insertador y extractor del sistema de archivos Boost usa & como el carácter de escape para " y & .

El estándar usará std::quoted (que usa / por defecto) para escapar " , que a su vez usa // para escapar / , vea esta referencia .

Demo

Es probable que sea la única diferencia entre ellos.

La razón de esa diferencia se puede encontrar en N3399