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, como c:\ 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 de terminação nula de caracteres de wchar_t, codificada como UTF-16 (um ou mais elementos para cada character (caractere)).

  • O Posix usa uma sequência de terminação nula de char, codificada como UTF-8 (um ou mais elementos para cada character (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

Funções <filesystem>

Operadores

Operadores <filesystem>

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

Confira também

Referência de arquivos de cabeçalho