Nomeando arquivos, caminhos e namespaces

Todos os sistemas de arquivos com Windows usam o conceito de arquivos e diretórios para acessar dados armazenados em um disco ou dispositivo. Windows desenvolvedores que trabalham com as APIs de Windows para E/S de arquivo e dispositivo devem entender as várias regras, convenções e limitações de nomes para arquivos e diretórios.

Os dados podem ser acessados de discos, dispositivos e compartilhamentos de rede usando APIs de E/S de arquivo. 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 se eles são de um disco ou um dispositivo ou uma conexão de rede para uma operação específica.

Alguns sistemas de arquivos, como NTFS, são suportados por arquivos e diretórios vinculados, que também seguem as convenções de nomenização de arquivo e as regras, assim como um arquivo ou diretório regular. Para obter informações adicionais, consulte Links rígidos e junções e Pontos de reparse e operações de arquivo.

Para obter informações adicionais, consulte as seguintes subseções:

Para saber mais sobre como configurar o Windows 10 para dar suporte a caminhos de arquivo longos, consulte Limitação máxima do comprimento do caminho.

Nomes de arquivo e diretório

Todos os sistemas de arquivos seguem as mesmas convenções gerais de nomen por 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 que o designa como um diretório, mas, caso contrário, deve seguir todas as mesmas regras de nomenização que 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 arquivo de termo geral 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 nomen por nome ou uso ou exemplos para um arquivo também devem ser aplicados a um diretório. O termo caminho refere-se a um ou mais diretórios, backslashes e, possivelmente, a 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 de nome de caminho usado. Isso é ainda mais complicado pelo suporte para mecanismos de compatibilidade com backward. Por exemplo, o sistema de arquivos FAT do MS-DOS mais antigo dá suporte a um máximo de 8 caracteres para o nome do arquivo base e três caracteres para a extensão, para um total de 12 caracteres, incluindo o separador de ponto. Isso é normalmente conhecido como um nome de arquivo 8.3. Os sistemas de arquivos Windows FAT e NTFS não estão limitados a nomes de arquivo 8.3, pois 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 faixa invertida ( \ ) para separar os componentes de um caminho. A faixa invertida divide o nome do arquivo do caminho até ele e um nome de diretório de outro nome de diretório em um caminho. Não é possível usar uma faixa invertida no nome do arquivo ou diretório real porque ele é um caractere reservado que separa os nomes em componentes.

  • Use uma faixa invertida conforme necessário como parte dos nomes de volume, por exemplo, o "C: " em "arquivo de caminho \ C:" ou o " compartilhamento de servidor" em " arquivo de caminho de compartilhamento de servidor" para nomes UNC (Convenção Universal de Nomenanação). \ \ \ \ \ \ \ \ \ \ Para obter mais informações sobre nomes UNC, consulte a seção Limitação máxima do comprimento do caminho.

  • Não suponha a sensibilidade a caso. Por exemplo, considere os nomes DEmão, Paulo e paulo como os mesmos, mesmo que alguns sistemas de arquivos (como um sistema de arquivos em conformidade com POSIX) possam considerá-los como diferentes. Observe que o NTFS dá suporte à semântica POSIX para a sensibilidade de caso, mas esse não é o comportamento padrão. Para obter mais informações, consulte CreateFile.

  • Os designadores de volume (letras de unidade) não fazem a mesma análise de 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 estendidos (128 a 255), exceto pelo seguinte:

    • Os seguintes caracteres reservados:

      • < (menor que)
      • > (maior que)
      • : (dois-pontos)
      • "(aspas duplas)
      • / (barra)
      • \ (faixa invertida)
      • | (barra vertical ou pipe)
      • ? (ponto de interrogação)
      • * (asterisco)
    • Valor inteiro zero, às vezes chamado de caractere NUL ASCII.

    • Caracteres cujas representações de inteiro estão no intervalo de 1 a 31, exceto para fluxos de dados alternativos em que esses caracteres são permitidos. Para obter mais informações sobre fluxos de arquivos, consulte Arquivo Fluxos.

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

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

  • Use dois períodos consecutivos (..) como um componente de diretório 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, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 e LPT9. Evite também esses nomes seguidos imediatamente por uma extensão; por exemplo, NUL.txt não é recomendado. Para obter mais informações, consulte Namespaces.

  • Não termine um nome de arquivo ou diretório com um espaço ou um ponto final. Embora o sistema de arquivos subjacente possa dar suporte a esses nomes, o shell 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 nomenlicação de estilo MS-DOS curta (também chamada de 8.3). Quando você cria um nome de arquivo longo, Windows também pode criar um formato curto 8.3 do nome, chamado de alias 8.3 ou nome curto, e armazená-lo em disco também. Esse alias 8.3 pode ser desabilitado por motivos de desempenho em todo o sistema ou por um volume especificado, dependendo do sistema de arquivos específico.

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

Em muitos sistemas de arquivos, um nome de arquivo conterá um til (~) dentro de cada componente do nome que é muito longo para estar em conformidade com as regras de nomeação 8.3.

Observação

Nem todos os sistemas de arquivos seguem a convenção de substituição de til e os sistemas podem ser configurados para desabilitar a geração de alias 8.3, mesmo que normalmente sejam suportados. Portanto, não faça a suposição de 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:

Em sistemas de arquivos mais novos, 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.

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

Caminhos

O caminho para um arquivo especificado consiste em um ou mais componentes , separados por um caractere especial (uma faixa invertida), com cada componente geralmente sendo um nome de diretório ou nome de arquivo, mas com algumas exceções importantes discutidas abaixo. Geralmente, é essencial para a interpretação do sistema de um caminho como o início, ou prefixo, do caminho. Esse prefixo determina o namespace que o caminho está usando e, além disso, 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á restrito pelo comprimento máximo especificado para um sistema de arquivos específico. Em geral, essas regras se enquadram 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 a nomes de diretório. Para resumir, um caminho é simplesmente a representação de cadeia de caracteres da hierarquia entre todos os diretórios existentes para um determinado arquivo ou nome de diretório.

Caminhos vs. relativos totalmente qualificados

para Windows funções de API 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 ele não começar com um dos seguintes:

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

Se um nome de arquivo começar com apenas um designador de disco, mas não 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 de qual foi definido durante a operação mais recente do "diretório de alteração" nesse disco. Os exemplos desse 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.

Um caminho também é considerado relativo se contiver "pontos duplos"; ou seja, dois períodos juntos em um componente do caminho. Esse especificador especial é usado para denotar o diretório acima do diretório atual, também conhecido como "diretório pai". Os exemplos desse 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 é de 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 par ao diretório atual.

Os caminhos relativos podem combinar ambos os tipos de exemplo, por exemplo, "C:.. \tmp.txt ". Isso é útil porque, embora o sistema mantenha o controle da unidade atual junto com o diretório atual dessa unidade, ele também controla os diretórios atuais em cada uma das diferentes letras da unidade (se o seu sistema tiver mais de um), independentemente de qual designador de unidade está definido como a unidade atual.

Limitação Máxima do Comprimento do Caminho

em edições do Windows antes Windows 10 versão 1607, o comprimento máximo de um caminho é o _ caminho máximo, que é definido como 260 caracteres. em versões posteriores do Windows, é necessário alterar uma chave do registro ou usar a ferramenta Política de Grupo para remover o limite. Consulte limitação de comprimento máximo de caminho para obter detalhes completos.

Namespaces

há duas categorias principais de convenções de namespace usadas nas APIs de Windows, comumente conhecidas como namespaces do NT e os namespaces do Win32. O namespace do NT foi projetado para ser o namespace de nível mais baixo no qual outros subsistemas e namespaces podem existir, incluindo o subsistema Win32 e, por extensão, os namespaces do Win32. o POSIX é outro exemplo de um subsistema no Windows que é criado sobre o namespace do NT. as versões anteriores do Windows também definiram vários nomes predefinidos ou reservados para determinados dispositivos especiais, como portas de comunicação (serial e paralela) e o console de exibição padrão como parte do que agora é chamado de namespace de dispositivo NT e ainda têm suporte em versões atuais do Windows para compatibilidade com versões anteriores.

Namespaces de arquivo Win32

As convenções e a prefixação do namespace do Win32 são resumidas nesta seção e na seção a seguir, com descrições de como elas são usadas. observe que esses exemplos destinam-se ao uso com as funções de API Windows e não necessariamente funcionam com aplicativos Windows shell, como o Windows Explorer. por esse motivo, há uma maior variedade de caminhos possíveis do que o que normalmente está disponível em aplicativos Windows shell e Windows aplicativos que tiram proveito disso podem ser desenvolvidos usando essas convenções de namespace.

para e/s de arquivo, o \ \ prefixo "? \ " para uma cadeia de caracteres de caminho diz ao Windows APIs para desabilitar toda a análise de cadeia de caracteres e enviar a cadeia de caracteres que a segue diretamente para o sistema de arquivos. por exemplo, se o sistema de arquivos der suporte a caminhos e nomes de arquivos grandes, você poderá exceder os limites máximos de _ caminho que, de outra forma, são impostos pelas APIs de Windows. Para obter mais informações sobre a limitação de caminho máximo normal, consulte a seção anterior limitação de comprimento de caminho máximo.

Como ele desativa a expansão automática da cadeia de caracteres do caminho, o \ \ prefixo "? \ " também permite o uso de ".." e "." nos nomes de caminho, o que pode ser útil se você estiver tentando executar operações em um arquivo com esses especificadores de caminho relativo reservados, como parte do caminho totalmente qualificado.

Muitos, mas nem todas as APIs de e/s de arquivo dão suporte a " \ \ ? \ "; você deve examinar o tópico de referência de cada API para ter certeza.

Observe que as APIs do Unicode devem ser usadas para garantir que o \ \ prefixo "? \ " permita que você exceda o _ caminho máximo

Namespaces de dispositivo Win32

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

Por exemplo, se você quiser abrir a porta 1 de comunicações serial do sistema, poderá usar "COM1" na chamada para a função CreateFile . Isso funciona porque COM1 – COM9 fazem parte dos nomes reservados no namespace do NT, embora o uso do \ \ prefixo ". \ " também funcione com esses nomes de dispositivo. Por comparação, se você tiver uma placa de expansão serial de 100 portas instalada e quiser abrir o COM56, não será possível abri-la usando "COM56" porque não há nenhum namespace NT predefinido para COM56. Será necessário 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 " \ \ . \ PhysicalDisk x"(em que X é um valor inteiro válido) ou" \ \ . \ CdRom X". 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, pois 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 usados.

se você estiver trabalhando com Windows funções de API, deverá usar o \ \ prefixo ". \ " para acessar apenas os dispositivos e não os arquivos.

A maioria das APIs não oferecerá suporte \ \ a ". \ "; somente as que foram projetadas para trabalhar com o namespace do dispositivo o reconhecerão. Sempre verifique o tópico de referência de cada API para ter certeza.

Namespaces do NT

também há APIs que permitem o uso da convenção de namespace do NT, mas o Windows gerenciador de objetos torna isso desnecessário na maioria dos casos. para ilustrar, é útil procurar os namespaces de Windows no pesquisador de objetos do sistema usando a ferramenta Windows Sysinternals WinObj . Quando você executa essa ferramenta, o que vê é o namespace do NT que começa na raiz ou " \ ". A subpasta chamada "global??" é onde reside o namespace do Win32. Os objetos de dispositivo nomeados residem no namespace do NT no subdiretório "dispositivo". 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 que representa um volume seria algo como "HarddiskVolume1", embora o sufixo numérico possa variar. O nome "DR0" sob o 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 Windows aplicativos, os drivers de dispositivo criam um link simbólico (symlink) no namespace do Win32, "Global??", para seus respectivos objetos de dispositivo. Por exemplo, COM0 e COM1 no "global??" o subdiretório é simplesmente symlinks para Serial0 e serial1, "C:" é um symlink para HarddiskVolume1, "Physicaldrive0" é um symlink para DR0 e assim por diante. sem um symlink, um dispositivo especificado "Xxx" não estará disponível para nenhum aplicativo Windows usando as convenções de namespace do Win32, conforme descrito anteriormente. No entanto, um identificador poderia ser aberto para esse dispositivo usando qualquer API que ofereça suporte ao caminho absoluto do namespace do NT no formato " \ Device \ xxx".

Com a adição de suporte a vários usuários por meio de serviços de terminal e máquinas virtuais, ela se tornou mais necessária para virtualizar o dispositivo raiz de todo o sistema dentro do namespace do Win32. Isso foi feito adicionando o symlink chamado "GLOBALROOT" ao namespace Win32, que pode ser visto no "global??" subdiretório da ferramenta de navegador do WinObj anteriormente discutida e pode acessar por meio do caminho " \ \ ? \ GLOBALROOT". Esse prefixo garante que o caminho após ele procure no caminho raiz verdadeiro do Gerenciador de objetos do sistema e não em um caminho dependente da sessão.

Comparação de funcionalidade do sistema de arquivos