filesystem
Inclua o cabeçalho <filesystem>
para acessar classes e funções que manipulam e recuperam informações sobre caminhos, arquivos e diretórios.
Sintaxe
#include <filesystem> // C++17 standard header file name
#include <experimental/filesystem> // Header file for pre-standard implementation
using namespace std::experimental::filesystem::v1;
Importante
Desde o lançamento do Visual Studio de 2017, o cabeçalho <filesystem>
ainda não era um padrão de C++. O C++ no Visual Studio 2017 RTW implementa o padrão final de rascunho, encontrado em ISO/IEC JTC 1/SC 22/WG 21 N4100. O Visual Studio 2017 versão 15.7 e posterior dá suporte ao novo padrão C++17 <filesystem>
.
Essa é uma implementação completamente nova, incompatível com a versão std::experimental
anterior. Ela tornou-se necessária por suporte ao symlink, correções de bugs e alterações no comportamento exigido pelo padrão. No Visual Studio 2019 versão 16.3 e posterior, a inclusão de <filesystem>
fornece apenas o novo std::filesystem
. A inclusão de <experimental/filesystem>
fornece apenas a implementação antiga experimental. A implementação experimental será removida na próxima versão ABI recente das bibliotecas.
Esse cabeçalho dá suporte a sistemas de arquivos para uma de duas classes amplas de sistemas operacionais host: Microsoft Windows e POSIX.
Enquanto a maioria das funcionalidades são comuns para ambos os sistemas operacionais, este documento identifica onde ocorrem as diferenças. Por exemplo:
O Windows dá suporte a vários nomes de raiz, como
c:
ou\\network_name
. Um sistema de arquivos consiste em uma floresta de árvores, cada uma com o próprio diretório raiz, comoc:\
ou\\network_name\
, e cada uma com um diretório próprio atual, para completar um nome de caminho relativo (que não é um nome de caminho absoluto).O POSIX dá suporte a apenas uma árvore, sem nome de raiz, o único diretório raiz
/
e apenas um diretório atual.
Outra diferença significativa é a representação nativa dos nomes de caminho:
O Windows usa uma sequência terminada em nulo de
wchar_t
, codificada como UTF-16 (um ou mais elementos para cada caractere).POSIX usa uma sequência terminada em nulo de
char
, codificada como UTF-8 (um ou mais elementos para cada caractere).Um objeto da classe
path
armazena o nome do caminho no formato nativo, mas dá suporte à conversão fácil entre esse formato armazenado e vários formatos externos:Uma sequência de terminação nula de
char
, codificada como preferencial para o sistema operacional.Uma sequência de terminação nula de
char
, codificada como UTF-8.Uma sequência de terminação nula de
wchar_t
, codificada como preferencial para o sistema operacional.Uma sequência de terminação nula de
char16_t
, codificada como UTF-16.Uma sequência de terminação nula de
char32_t
, codificada como UTF-32.
Interconversões entre essas representações são mediadas, conforme necessário, pelo uso de uma ou mais facetas de
codecvt
. Se nenhum objeto de localidade específico tiver sido designado, essas facetas serão obtidas da localidade global.
Outra diferença é o detalhamento com que cada sistema operacional permite especificar permissões de acesso de arquivo ou diretório:
O Windows registra se um arquivo é somente leitura ou gravável, um atributo que não tem nenhum significado para diretórios.
O POSIX registra se um arquivo pode ser lido, gravado ou executado (verificado se for um diretório). Ele registra também se cada operação é permitida para o proprietário, o grupo do proprietário ou para todos, além de algumas outras permissões.
É comum aos dois sistemas a estrutura imposta a um nome de caminho quando você passar do nome da raiz. Para o nome do caminho c:/abc/xyz/def.ext
:
O nome da raiz é
c:
.O diretório raiz é
/
.O caminho raiz é
c:/
.O caminho relativo é
abc/xyz/def.ext
.O caminho pai é
c:/abc/xyz
.O nome do arquivo é
def.ext
.O stem é
def
.A extensão é
.ext
.
Uma pequena diferença é o separador preferencial entre a sequência de diretórios em um nome de caminho. Os dois sistemas operacionais permitem escrever uma barra /
, mas em alguns contextos o Windows prefere uma barra invertida \
. A implementação armazena o separador preferencial dela no membro de dados preferred_separator
em path
.
Por fim, objetos path
têm um recurso importante: você pode usá-los sempre que um argumento de nome de arquivo for necessário nas classes definidas no cabeçalho <fstream>
.
Para obter mais informações e exemplos de código, confira Navegação do sistema de arquivos (C++).
Membros
Classes
Nome | Descrição |
---|---|
directory_entry classe |
Descreve um objeto retornado por um directory_iterator ou um recursive_directory_iterator e contém um path . |
directory_iterator classe |
Descreve um iterador de entrada que percorre em sequência os nomes de arquivo no diretório de um sistema de arquivos. |
filesystem_error classe |
Uma classe base para exceções que são geradas para relatar um estouro de baixo nível no sistema. |
path classe |
Define uma classe que armazena um objeto do tipo de modelo String que é adequado para uso como um nome de arquivo. |
recursive_directory_iterator classe |
Descreve um iterador de entrada que percorre em sequência os nomes de arquivo no diretório de um sistema de arquivos. O iterador também pode descer para subdiretórios. |
file_status classe |
Encapsula um file_type . |
Estruturas
Nome | Descrição |
---|---|
Estrutura space_info |
Mantém informações sobre um volume. |
Funções
Operadores
Enumerações
Nome | Descrição |
---|---|
copy_options |
Uma enumeração que é usada com copy_file e determina o comportamento se um arquivo de destino já existir. |
directory_options |
Uma enumeração que especifica opções para iteradores de diretório. |
file_type |
Uma enumeração de tipos de arquivo. |
perm_options |
Enumera opções para a função permissions . |
perms |
Um tipo de bitmask usado para transmitir permissões e opções de permissões |