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_size
para 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) -
path
descomposiciones y combinaciones depath
pueden 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