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:
- 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_sizepara un directorio o un archivo de dispositivo
-
filename(), normalización y conversiones relativas / absolutas redefinidas (ejemplos para POSIX):-
path("foo/.").lexically_normal()=="foo/"(es lo contrario en Boost) -
path("foo/").filename()==""(espath(".")en Boost) -
remove_filename()deja la barra diagonal final y, por lo tanto, es idempotente (asignaparent_path()en Boost) -
path(".profile").extension()==""(es el nombre completo en Boost) -
pathdescomposiciones y combinaciones depathpueden conservar cosas como nombres de flujos de datos alternativos que normalmente son invisibles -
path("foo")/"/bar"=="/bar"(espath("foo/bar")en Boost), que permite componer nombres de archivos relativos con otros (absoluto o relativo) y reemplaza aabsolute()de Boostabsolute() - El
system_complete()Boost (que toma solo un argumento) cambia su nombre aabsolute() -
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 .
Es probable que sea la única diferencia entre ellos.
La razón de esa diferencia se puede encontrar en N3399