Partilhar via


Nomeando arquivos, caminhos e namespaces

Os sistemas de arquivos suportados pelo Windows usam o conceito de arquivos e diretórios para acessar dados armazenados em um disco ou dispositivo. Os desenvolvedores do Windows que trabalham com as APIs do Windows para E/S de arquivos e dispositivos devem entender as regras, convenções e limitações de nomes para arquivos e diretórios.

Os dados podem ser acessados a partir de discos, dispositivos e compartilhamentos de rede usando APIs de E/S de arquivos. Arquivos e diretórios, juntamente com namespaces, fazem parte do conceito de um caminho, que é uma representação de cadeia de caracteres de onde obter os dados, independentemente de ser de um disco ou um dispositivo ou uma conexão de rede para uma operação específica.

Alguns sistemas de arquivos, como NTFS, suportam arquivos e diretórios vinculados, que também seguem convenções e regras de nomenclatura de arquivos, assim como um arquivo ou diretório comum. Para obter informações adicionais, consulte Links Fixos e Junções e Pontos de Reanálise e Operações de Ficheiro.

Para saber mais sobre como configurar o Windows para suportar caminhos de arquivo longos, consulte Maximum Path Length Limitation.

Nomes de arquivos e diretórios

Todos os sistemas de arquivos seguem as mesmas convenções gerais de nomenclatura para um arquivo individual: um nome de arquivo base e uma extensão opcional, separados por um ponto. No entanto, cada sistema de arquivos, como NTFS, CDFS, exFAT, UDFS, FAT e FAT32, pode ter regras específicas e diferentes sobre a formação dos componentes individuais no caminho para um diretório ou arquivo. Observe que um diretório é simplesmente um arquivo com um atributo especial designando-o como um diretório, mas caso contrário, deve seguir todas as mesmas regras de nomenclatura de um arquivo regular. Como o termo diretório simplesmente se refere a um tipo especial de arquivo no que diz respeito ao sistema de arquivos, algum material de referência usará o termo geral arquivo para abranger os conceitos de diretórios e arquivos de dados como tal. Por isso, a menos que especificado de outra forma, quaisquer regras de nomenclatura ou uso ou exemplos para um arquivo também devem se aplicar a um diretório. O termo caminho refere-se a um ou mais diretórios, barras invertidas (backslashes) e, possivelmente, um nome de volume. Para obter mais informações, consulte a seção Caminhos.

As limitações de contagem de caracteres também podem ser diferentes e podem variar dependendo do sistema de arquivos e do formato de prefixo do nome do caminho usado. Isso é ainda mais complicado pelo suporte a mecanismos de compatibilidade com versões anteriores. Por exemplo, o sistema de arquivos MS-DOS FAT mais antigo suporta um máximo de 8 caracteres para o nome do arquivo base e 3 caracteres para a extensão, para um total de 12 caracteres, incluindo o separador de pontos. Isso é comumente conhecido como um nome de arquivo 8.3. Os sistemas de arquivos FAT e NTFS do Windows não estão limitados a nomes de arquivo 8.3, porque eles têm suporte a nomes de arquivo longos, mas ainda suportam a versão 8.3 de nomes de arquivo longos.

Convenções de nomenclatura

As seguintes regras fundamentais permitem que os aplicativos criem e processem nomes válidos para arquivos e diretórios, independentemente do sistema de arquivos:

  • Use um ponto para separar o nome do arquivo base da extensão no nome de um diretório ou arquivo.

  • Use uma barra invertida (\) para separar os componentes de um caminho . A barra transversal divide o nome do ficheiro do caminho para ele e divide um nome de diretório de outro nome de diretório em um caminho. Não é possível usar uma barra invertida no nome do arquivo ou diretório real porque é um caractere reservado que separa os nomes em componentes.

  • Use uma barra invertida conforme necessário como parte de nomes de volume, por exemplo, o "C:\" em "C:\path\file" ou o "\\server\share" em "\\server\share\path\file" para nomes UNC (Convenção Universal de Nomenclatura). Para obter mais informações sobre nomes UNC, consulte a seção Maximum Path Length Limitation.

  • Não assuma a diferenciação de maiúsculas e minúsculas. Por exemplo, considere que os nomes OSCAR, Oscar e Oscar são os mesmos, embora alguns sistemas de arquivos (como um sistema de arquivos compatível com POSIX) possam considerá-los diferentes. Observe que o NTFS suporta semântica POSIX para diferenciação de maiúsculas e minúsculas, mas esse não é o comportamento padrão. Para obter mais informações, consulte CreateFile.

  • Os designadores de volume (letras de unidade) são insensíveis a maiúsculas e minúsculas. Por exemplo, "D:\" e "d:\" referem-se ao mesmo volume.

  • Use qualquer caractere na página de código atual para um nome, incluindo caracteres Unicode e caracteres no conjunto de caracteres estendido (128–255), exceto para o seguinte:

    • Os seguintes caracteres reservados:

      • < (inferior a)
      • > (maior que)
      • : (dois pontos)
      • " (aspas duplas)
      • / (barra para a frente)
      • \ (barra invertida)
      • | (barra ou tubo vertical)
      • ? (ponto de interrogação)
      • * (asterisco)
    • Valor inteiro zero, às vezes referido como ASCII NUL caractere.

    • Caracteres cujas representações inteiras estão no intervalo de 1 a 31, exceto para fluxos de dados alternativos onde esses caracteres são permitidos. Para obter mais informações sobre fluxos de arquivos, consulte File Streams.

    • Qualquer outro caractere que o sistema de arquivos de destino não permita.

  • Use um ponto como componente de diretório num caminho para indicar o diretório atual, por exemplo, ".\temp.txt". Para obter mais informações, consulte Caminhos.

  • Use dois períodos consecutivos (..) como um diretório componente em um caminho para representar o pai do diretório atual, por exemplo "..\temp.txt". Para obter mais informações, consulte Caminhos.

  • Não use os seguintes nomes reservados para o nome de um arquivo:

    CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM³, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT² e LPT³. Evite também estes nomes seguidos imediatamente de uma extensão; por exemplo, NUL.txt e NUL.tar.gz são equivalentes ao NUL. Para obter mais informações, consulte Namespaces.

    Observação

    O Windows reconhece os dígitos sobrescritos de 8 bits , ISO/IEC 8859-1, ¹, ² e ³ como dígitos e os trata como componentes válidos dos nomes de dispositivos COM# e LPT#, o que os torna reservados em todos os diretórios. Por exemplo, echo test > COM¹ falha ao criar um arquivo.

  • Não termine um nome de arquivo ou diretório com um espaço ou um ponto. Embora o sistema de arquivos subjacente possa suportar esses nomes, o shell do Windows e a interface do usuário não. No entanto, é aceitável especificar um ponto como o primeiro caractere de um nome. Por exemplo, ".temp".

Nomes curtos vs. longos

Um nome de arquivo longo é considerado qualquer nome de arquivo que exceda a convenção de nomenclatura de estilo de MS-DOS curto (também chamado de 8.3). Quando você cria um nome de arquivo longo, o Windows também pode criar uma forma curta 8.3 do nome, chamado de 8.3 alias ou nome curto, e armazená-lo no disco também. Esse aliasing 8.3 pode ser desativado por motivos de desempenho em todo o sistema ou para um volume especificado, dependendo do sistema de arquivos específico.

Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: o aliasing 8.3 não pode ser desabilitado para volumes especificados até o Windows 7 e o Windows Server 2008 R2.

Em muitos sistemas de arquivos, o nome de um ficheiro conterá uma tilde (~) dentro de cada componente do nome que é demasiado longo para estar em conformidade com as regras de nomenclatura 8.3.

Observação

Nem todos os sistemas de arquivos seguem a convenção de substituição da til, e os sistemas podem ser configurados para desabilitar a geração de alias 8.3, mesmo que normalmente o permitam. Portanto, não assuma que o alias 8.3 já existe no disco.

Para solicitar nomes de arquivo 8.3, nomes de arquivo longos ou o caminho completo de um arquivo do sistema, considere as seguintes opções:

  • Para obter a forma 8.3 de um nome de ficheiro longo, use a função GetShortPathName.
  • Para obter a versão longa de um nome de arquivo curto, use a função GetLongPathName.
  • Para obter o caminho completo para um ficheiro, use a função GetFullPathName.

Em sistemas de arquivos mais recentes, como NTFS, exFAT, UDFS e FAT32, o Windows armazena os nomes de arquivo longos no disco em Unicode, o que significa que o nome de arquivo longo original é sempre preservado. Isso é verdadeiro mesmo se um nome de arquivo longo contiver caracteres estendidos, independentemente da página de código que está ativa durante uma operação de leitura ou gravação de disco.

Os ficheiros que utilizam nomes de ficheiros longos podem ser copiados entre partições do sistema de ficheiros NTFS e partições do sistema de ficheiros FAT do Windows sem perder qualquer informação de nome de ficheiro. Isso pode não ser verdade para o mais antigo FAT de MS-DOS e alguns tipos de sistemas de ficheiros CDFS (CD-ROM), dependendo do nome real do ficheiro. Nesse caso, o nome de arquivo curto é substituído, se possível.

Percursos

O caminho para um arquivo especificado consiste em um ou mais componentes , separados por um caractere especial (uma barra invertida), com cada componente geralmente sendo um nome de diretório ou nome de arquivo, mas com algumas exceções notáveis discutidas abaixo. Muitas vezes, é fundamental para a interpretação do sistema de um caminho como é o início, ou prefixo, do caminho. Esse prefixo determina o namespace o caminho está usando e, adicionalmente, quais caracteres especiais são usados em qual posição dentro do caminho, incluindo o último caractere.

Se um componente de um caminho for um nome de arquivo, ele deverá ser o último componente.

Cada componente de um caminho também será limitado pelo comprimento máximo especificado para um determinado sistema de arquivos. Em geral, estas regras dividem-se em duas categorias: curto e longo. Observe que os nomes de diretório são armazenados pelo sistema de arquivos como um tipo especial de arquivo, mas as regras de nomenclatura para arquivos também se aplicam aos nomes de diretório. Para resumir, um caminho é simplesmente a representação de cadeia de caracteres da hierarquia entre todos os diretórios que existem para um determinado arquivo ou nome de diretório.

Caminhos totalmente qualificados vs. caminhos relativos

Para funções da API do Windows que manipulam arquivos, os nomes de arquivo geralmente podem ser relativos ao diretório atual, enquanto algumas APIs exigem um caminho totalmente qualificado. Um nome de arquivo é relativo ao diretório atual se não começar com um dos seguintes:

  • Um nome UNC de qualquer formato, que começa sempre com dois caracteres de barra invertida ("\\"). Para obter mais informações, consulte a próxima seção.
  • Um designador de disco seguido por uma barra invertida, como por exemplo "C:\" ou "d:\".
  • Uma única barra invertida, por exemplo, "\directory" ou "\file.txt". Isso também é referido como um caminho absoluto.

Se um nome de arquivo começar com apenas um designador de disco, mas não com a barra invertida após os dois pontos, ele será interpretado como um caminho relativo para o diretório atual na unidade com a letra especificada. Observe que o diretório atual pode ou não ser o diretório raiz, dependendo do que ele foi definido durante a operação mais recente de "alterar diretório" nesse disco. Exemplos deste formato são os seguintes:

  • "C:tmp.txt" refere-se a um arquivo chamado "tmp.txt" no diretório atual na unidade C.
  • "C:tempdir\tmp.txt" refere-se a um arquivo em um subdiretório para o diretório atual na unidade C.

Diz-se também que um caminho é relativo se contiver "pontos duplos"; ou seja, dois períodos juntos em um componente do caminho. Este especificador especial é usado para denotar o diretório acima do diretório atual, também conhecido como o "diretório pai". Exemplos deste formato são os seguintes:

  • "..\tmp.txt" especifica um arquivo chamado tmp.txt localizado no pai do diretório atual.
  • "..\..\tmp.txt" especifica um arquivo que está dois diretórios acima do diretório atual.
  • "..\tempdir\tmp.txt" especifica um arquivo chamado tmp.txt localizado em um diretório chamado tempdir que é um diretório ponto a ponto para o diretório atual.

Os caminhos relativos podem combinar ambos os tipos de exemplo, por exemplo "C:..\tmp.txt". Isso é útil porque, embora o sistema acompanhe a unidade atual juntamente com o diretório atual dessa unidade, ele também acompanha os diretórios atuais em cada uma das diferentes designações de unidade (se o sistema tiver mais de uma), independentemente de quais designadores de unidade estão definidos como a unidade atual.

Limitação do comprimento máximo do caminho

Nas edições do Windows anteriores ao Windows 10 versão 1607, o comprimento máximo de um caminho é MAX_PATH, que é definido como 260 caracteres. Em versões posteriores do Windows, é necessário alterar uma chave do Registro ou usar a ferramenta Diretiva de Grupo para remover o limite. Veja Limitação de Comprimento Máximo de Caminho para obter detalhes completos.

Espaços para nomes

Há duas categorias principais de convenções de namespace usadas nas APIs do Windows, comumente chamadas de namespaces NT e os namespaces Win32. O namespace NT foi projetado para ser o namespace de nível mais baixo no qual outros subsistemas e namespaces poderiam existir, incluindo o subsistema Win32 e, por extensão, os namespaces Win32. POSIX é outro exemplo de um subsistema no Windows que é construído sobre o namespace NT. As versões anteriores do Windows também definiam vários nomes predefinidos, ou reservados, para determinados dispositivos especiais, como portas de comunicação (seriais e paralelas) e o console de exibição padrão como parte do que agora é chamado de namespace de dispositivo NT, e ainda são suportados nas versões atuais do Windows para compatibilidade com versões anteriores.

Namespaces de Ficheiros Win32

O prefixo e as convenções do namespace Win32 são resumidos nesta seção e na seção a seguir, com descrições de como eles são usados. Observe que esses exemplos destinam-se ao uso com as funções da API do Windows e nem todos funcionam necessariamente com aplicativos de shell do Windows, como o Windows Explorer. Por esse motivo, há uma gama mais ampla de caminhos possíveis do que normalmente está disponível em aplicativos de shell do Windows, e os aplicativos do Windows que aproveitam isso podem ser desenvolvidos usando essas convenções de namespace.

Para E/S de ficheiro, o prefixo "\\?\" numa cadeia de caracteres de caminho indica às APIs do Windows que desativem qualquer processamento da cadeia de caracteres e enviem diretamente a sequência que se segue ao sistema de ficheiros. Por exemplo, se o sistema de arquivos oferecer suporte a caminhos grandes e nomes de arquivos, você poderá exceder os limites de MAX_PATH impostos pelas APIs do Windows.

Como desativa a expansão automática do caminho, o prefixo "\\?\" também permite o uso de ".." e "." nos nomes de caminho, o que pode ser útil caso se esteja a tentar realizar operações num ficheiro com estes especificadores de caminho relativos reservados como parte do caminho totalmente qualificado.

Muitas APIs de E/S de arquivos, mas não todas, suportam "\\?\"; você deve olhar para o tópico de referência para cada API para ter certeza.

Observe que as APIs Unicode devem ser usadas para garantir que o prefixo "\\?\" permita que você exceda o MAX_PATH.

Namespaces de dispositivos Win32

O prefixo "\\.\" acessará o namespace do dispositivo Win32 em vez do namespace do arquivo Win32. É assim que o acesso a discos e volumes físicos é realizado diretamente, sem passar pelo sistema de arquivos, se a API suportar esse tipo de acesso. Você pode acessar muitos dispositivos além de discos dessa maneira (usando as funções CreateFile e DefineDosDevice, por exemplo).

Por exemplo, se você quiser abrir a porta de comunicação serial 1 do sistema, você pode usar "COM1" na chamada para a função CreateFile. Isso funciona porque COM1–COM9 fazem parte dos nomes reservados no namespace NT, embora o uso do prefixo "\\.\" também funcione com esses nomes de dispositivo. Em comparação, se você tiver uma placa de expansão serial de 100 portas instalada e quiser abrir COM56, não poderá abri-la usando "COM56" porque não há nenhum namespace NT predefinido para COM56. Você precisará abri-lo usando "\\.\COM56" porque "\\.\" vai diretamente para o namespace do dispositivo sem tentar localizar um alias predefinido.

Outro exemplo de uso do namespace de dispositivo Win32 é usar a função CreateFile com "\\.\PhysicalDriveX" (onde X é um valor inteiro válido) ou "\\.\CdRomX". Isso permite que você acesse esses dispositivos diretamente, ignorando o sistema de arquivos. Isso funciona porque esses nomes de dispositivo são criados pelo sistema à medida que esses dispositivos são enumerados, e alguns drivers também criarão outros aliases no sistema. Por exemplo, o driver de dispositivo que implementa o nome "C:\" tem seu próprio namespace que também é o sistema de arquivos.

As APIs que passam pela função CreateFile geralmente funcionam com o prefixo "\\.\" porque CreateFile é a função usada para abrir arquivos e dispositivos, dependendo dos parâmetros que você usa.

Se estiver a trabalhar com funções da API do Windows, deve utilizar o prefixo "\\.\" para aceder apenas a dispositivos e não a ficheiros.

A maioria das APIs não suporta "\\.\"; Somente aqueles que são projetados para trabalhar com o namespace do dispositivo irão reconhecê-lo. Sempre verifique o tópico de referência para cada API para ter certeza.

NT Namespaces

Há também APIs que permitem o uso da convenção de namespace NT, mas o Gerenciador de Objetos do Windows torna isso desnecessário na maioria dos casos. Para ilustrar, é útil procurar os namespaces do Windows no navegador de objetos do sistema usando a ferramenta Windows Sysinternals WinObj. Quando você executa essa ferramenta, o que você vê é o namespace NT começando na raiz ou "\". A subpasta chamada "Global??" é onde o namespace Win32 reside. Os objetos de dispositivo nomeados residem no namespace NT dentro do subdiretório "Device". Aqui você também pode encontrar Serial0 e Serial1, os objetos de dispositivo que representam as duas primeiras portas COM, se presentes no seu sistema. Um objeto de dispositivo representando um volume seria algo como "HarddiskVolume1", embora o sufixo numérico possa variar. O nome "DR0" no subdiretório "Harddisk0" é um exemplo do objeto de dispositivo que representa um disco e assim por diante.

Para tornar esses objetos de dispositivo acessíveis por aplicativos do Windows, os drivers de dispositivo criam um link simbólico no namespace Win32, "Global??", para os seus respetivos objetos de dispositivo. Por exemplo, COM0 e COM1 no subdiretório "Global??" são simplesmente links simbólicos para Serial0 e Serial1, "C:" é um link simbólico para HarddiskVolume1, "Physicaldrive0" é um link simbólico para DR0, e assim por diante. Sem um link simbólico, um dispositivo especificado "Xxx" não estará disponível para qualquer aplicativo do Windows usando convenções de namespace Win32, conforme descrito anteriormente. No entanto, pode ser estabelecida uma ligação a esse dispositivo usando quaisquer APIs que ofereçam suporte ao formato de caminho absoluto do namespace NT "\Device\Xxx".

Com a adição de suporte multiusuário via Serviços de Terminal e máquinas virtuais, tornou-se ainda mais necessário virtualizar o dispositivo raiz de todo o sistema dentro do namespace Win32. Isso foi feito adicionando o link simbólico chamado "GLOBALROOT" ao namespace Win32, que você pode ver no subdiretório "Global??" da ferramenta de navegador WinObj discutida anteriormente e pode acessar através do caminho "\\?\GLOBALROOT". Esse prefixo garante que o caminho que o segue pareça no caminho raiz verdadeiro do gerenciador de objetos do sistema e não em um caminho dependente da sessão.

Ver também