Denominazione di file, percorsi e spazi dei nomi
I file system supportati da Windows usano il concetto di file e directory per accedere ai dati archiviati in un disco o in un dispositivo. Gli sviluppatori Windows che collaborano con le API di Windows per l'I/O di file e dispositivo devono comprendere le regole, le convenzioni e le limitazioni dei nomi per file e directory.
È possibile accedere ai dati da dischi, dispositivi e condivisioni di rete usando le API di I/O dei file. I file e le directory, insieme agli spazi dei nomi, fanno parte del concetto di percorso, ovvero una rappresentazione di stringa di dove ottenere i dati indipendentemente dal fatto che si tratti di un disco o di un dispositivo o di una connessione di rete per un'operazione specifica.
Alcuni file system, ad esempio NTFS, supportano file e directory collegati, che seguono anche le convenzioni di denominazione dei file e le regole come un normale file o directory. Per altre informazioni, vedere Collegamenti rigidi e giunzioni e Reparse Points and File Operations.For additional information, see Hard Links and Junctions and Reparse Points and File Operations.
Per informazioni sulla configurazione di Windows per supportare percorsi di file lunghi, vedere Limitazione massima della lunghezza del percorso.
Nomi di file e directory
Tutti i file system seguono le stesse convenzioni di denominazione generali per un singolo file: un nome di file di base e un'estensione facoltativa, separati da un punto. Tuttavia, ogni file system, ad esempio NTFS, CDFS, exFAT, UDFS, FAT e FAT32, può avere regole specifiche e diverse sulla formazione dei singoli componenti nel percorso di una directory o di un file. Si noti che una directory è semplicemente un file con un attributo speciale che lo designa come directory, ma in caso contrario deve seguire tutte le stesse regole di denominazione di un file normale. Poiché il termine directory si riferisce semplicemente a un tipo speciale di file per quanto riguarda il file system, alcuni materiali di riferimento useranno il file di termine generale per includere entrambi i concetti delle directory e dei file di dati come tali. Per questo motivo, a meno che non diversamente specificato, eventuali regole di denominazione o utilizzo o esempi per un file devono essere applicati anche a una directory. Il termine percorso si riferisce a una o più directory, barre rovesciata ed eventualmente un nome di volume. Per altre informazioni, vedere la sezione Percorsi .
Le limitazioni del numero di caratteri possono anche essere diverse e possono variare a seconda del formato del prefisso del nome del file system e del percorso usato. Questo è ulteriormente complicato dal supporto per i meccanismi di compatibilità con le versioni precedenti. Ad esempio, il file system FAT MS-DOS precedente supporta un massimo di 8 caratteri per il nome del file di base e 3 caratteri per l'estensione, per un totale di 12 caratteri incluso il separatore punto. Questo nome è comunemente noto come nome di file 8.3. I file system FAT e NTFS di Windows non sono limitati ai nomi di file 8.3, perché hanno un supporto per nomi di file lunghi, ma supportano comunque la versione 8.3 dei nomi di file lunghi.
Convenzioni di denominazione
Le regole fondamentali seguenti consentono alle applicazioni di creare ed elaborare nomi validi per file e directory, indipendentemente dal file system:
Usare un punto per separare il nome del file di base dall'estensione nel nome di una directory o di un file.
Usare una barra rovesciata (\) per separare i componenti di un percorso. La barra rovesciata divide il nome del file dal percorso e un nome di directory da un altro nome di directory in un percorso. Non è possibile utilizzare una barra rovesciata nel nome per il file o la directory effettiva perché è un carattere riservato che separa i nomi in componenti.
Usare una barra rovesciata come parte dei nomi di volume, ad esempio "C:\" in "C:\path\file" o "\\server\share" in "\server\share\path\file" per i nomi UNC (Universal Naming Convention). Per altre informazioni sui nomi UNC, vedere la sezione Limite di lunghezza massima percorso.
Non presupporre la distinzione tra maiuscole e minuscole. Si considerino ad esempio i nomi OSCAR, Oscar e oscar allo stesso modo, anche se alcuni file system (ad esempio un file system conforme a POSIX) possono considerarli diversi. Si noti che NTFS supporta la semantica POSIX per la distinzione tra maiuscole e minuscole, ma questo non è il comportamento predefinito. Per altre informazioni, vedere CreateFile.
I designatori di volume (lettere di unità) sono analogamente senza distinzione tra maiuscole e minuscole. Ad esempio, "D:\" e "d:\" fanno riferimento allo stesso volume.
Usare qualsiasi carattere nella tabella codici corrente per un nome, inclusi caratteri Unicode e caratteri nel set di caratteri esteso (128-255), ad eccezione dei seguenti:
I caratteri riservati seguenti:
- < (minore di)
- > (maggiore di)
- : (due punti)
- " (virgolette doppie)
- / (barra)
- \ (barra rovesciata)
- | (barra verticale o tubo)
- ? (punto interrogativo)
- * (asterisco)
Valore intero zero, talvolta definito carattere NUL ASCII.
Caratteri i cui numeri interi sono compresi nell'intervallo compreso tra 1 e 31, ad eccezione dei flussi di dati alternativi in cui questi caratteri sono consentiti. Per altre informazioni sui flussi di file, vedere Flussi di file.
Qualsiasi altro carattere non consentito dal file system di destinazione.
Usare un punto come componente di directory in un percorso per rappresentare la directory corrente, ad esempio ".\temp.txt". Per altre informazioni, vedere Percorsi.
Usare due punti consecutivi (..) come componente di directory in un percorso per rappresentare l'elemento padre della directory corrente, ad esempio ".. \temp.txt". Per altre informazioni, vedere Percorsi.
Non usare i nomi riservati seguenti per il nome di un file:
CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM², COM², LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT² e LPT². Evitare anche questi nomi seguiti immediatamente da un'estensione; ad esempio, NUL.txt e NUL.tar.gz sono entrambi equivalenti a NUL. Per altre informazioni, vedere Spazi dei nomi.
Nota
Windows riconosce le cifre di apice ISO/IEC 8859-1 a 8 bit ¹, ² e ² come cifre e le considera come parti valide dei nomi dei dispositivi COM# e LPT#, rendendoli riservati in ogni directory. Ad esempio,
echo test > COM¹
non riesce a creare un file.Non terminare un nome di file o directory con uno spazio o un punto. Anche se il file system sottostante può supportare tali nomi, la shell di Windows e l'interfaccia utente non lo supporta. Tuttavia, è accettabile specificare un punto come primo carattere di un nome. Ad esempio, ".temp".
Nomi brevi e lunghi
Un nome di file lungo viene considerato qualsiasi nome di file che supera la breve convenzione di denominazione di stile MS-DOS (denominata anche 8.3). Quando si crea un nome di file lungo, Windows può anche creare un breve formato 8.3 del nome, denominato alias 8.3 o nome breve, e archiviarlo anche su disco. Questo aliasing 8.3 può essere disabilitato per motivi di prestazioni a livello di sistema o per un volume specificato, a seconda del file system specifico.
Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: l'aliasing 8.3 non può essere disabilitato per i volumi specificati fino a Windows 7 e Windows Server 2008 R2.
In molti file system, un nome di file conterrà una tilde (~) all'interno di ogni componente del nome troppo lungo per essere conforme alle regole di denominazione 8.3.
Nota
Non tutti i file system seguono la convenzione di sostituzione tilde e i sistemi possono essere configurati per disabilitare la generazione di alias 8.3 anche se normalmente lo supportano. Pertanto, non si presuppone che l'alias 8.3 esista già su disco.
Per richiedere nomi di file 8.3, nomi di file lunghi o percorso completo di un file dal sistema, prendere in considerazione le opzioni seguenti:
- Per ottenere il formato 8.3 di un nome file lungo, usare la funzione GetShortPathName .
- Per ottenere la versione del nome file lungo di un nome breve, usare la funzione GetLongPathName .
- Per ottenere il percorso completo di un file, usare la funzione GetFullPathName .
Nei file system più recenti, ad esempio NTFS, exFAT, UDFS e FAT32, Windows archivia i nomi di file lunghi su disco in Unicode, il che significa che il nome file lungo originale viene sempre mantenuto. Questo vale anche se un nome di file lungo contiene caratteri estesi, indipendentemente dalla tabella codici attiva durante un'operazione di lettura o scrittura su disco.
I file che usano nomi di file lunghi possono essere copiati tra le partizioni del file system NTFS e le partizioni del file system FAT di Windows senza perdere informazioni sul nome file. Questo potrebbe non essere vero per i file system MS-DOS FAT meno recenti e alcuni tipi di file system CDFS (CD-ROM), a seconda del nome file effettivo. In questo caso, il nome breve del file viene sostituito, se possibile.
Percorsi
Il percorso di un file specificato è costituito da uno o più componenti, separati da un carattere speciale (una barra rovesciata), con ogni componente che in genere è un nome di directory o un nome di file, ma con alcune eccezioni rilevanti descritte di seguito. Spesso è fondamentale per l'interpretazione del sistema di un percorso che ha l'aspetto dell'inizio, o del prefisso, del percorso. Questo prefisso determina lo spazio dei nomi usato dal percorso e, inoltre, quali caratteri speciali vengono usati in quale posizione all'interno del percorso, incluso l'ultimo carattere.
Se un componente di un percorso è un nome di file, deve essere l'ultimo componente.
Ogni componente di un percorso sarà vincolato anche dalla lunghezza massima specificata per un file system specifico. In generale, queste regole rientrano in due categorie: short e long. Si noti che i nomi di directory vengono archiviati dal file system come tipo speciale di file, ma le regole di denominazione per i file si applicano anche ai nomi di directory. Per riepilogare, un percorso è semplicemente la rappresentazione di stringa della gerarchia tra tutte le directory esistenti per un determinato nome di file o directory.
Percorsi completi e relativi
Per le funzioni API di Windows che modificano i file, i nomi di file possono spesso essere relativi alla directory corrente, mentre alcune API richiedono un percorso completo. Un nome di file è relativo alla directory corrente se non inizia con uno dei seguenti:
- Nome UNC di qualsiasi formato, che inizia sempre con due caratteri barra rovesciata ("\\"). Per ulteriori informazioni, vedi la sezione successiva.
- Un designatore del disco con una barra rovesciata, ad esempio "C:\" o "d:\".
- Una singola barra rovesciata, ad esempio "\directory" o "\file.txt". Questo percorso viene anche definito percorso assoluto.
Se un nome file inizia solo con un designatore del disco ma non con la barra rovesciata dopo i due punti, viene interpretato come percorso relativo alla directory corrente nell'unità con la lettera specificata. Si noti che la directory corrente può essere o meno la directory radice a seconda di ciò che è stato impostato su durante l'operazione di "modifica directory" più recente su tale disco. Di seguito sono riportati alcuni esempi di questo formato:
- "C:tmp.txt" fa riferimento a un file denominato "tmp.txt" nella directory corrente nell'unità C.
- "C:tempdir\tmp.txt" fa riferimento a un file in una sottodirectory alla directory corrente nell'unità C.
Un percorso viene detto anche relativo se contiene "punti doppi"; ovvero due punti insieme in un componente del percorso. Questo identificatore speciale viene usato per indicare la directory sopra la directory corrente, altrimenti nota come "directory padre". Di seguito sono riportati alcuni esempi di questo formato:
- ".. \tmp.txt" specifica un file denominato tmp.txt che si trova nell'elemento padre della directory corrente.
- ".. \.. \tmp.txt" specifica un file che è due directory sopra la directory corrente.
- ".. \tempdir\tmp.txt" specifica un file denominato tmp.txt che si trova in una directory denominata tempdir che è una directory peer nella directory corrente.
I percorsi relativi possono combinare entrambi i tipi di esempio, ad esempio "C:.. \tmp.txt". Ciò è utile perché, anche se il sistema tiene traccia dell'unità corrente insieme alla directory corrente di tale unità, tiene traccia anche delle directory correnti in ognuna delle diverse lettere di unità (se il sistema ha più di una), indipendentemente dal designatore di unità impostato come unità corrente.
Limitazione massima della lunghezza del percorso
Nelle edizioni di Windows precedenti a Windows 10 versione 1607, la lunghezza massima per un percorso è MAX_PATH, definita come 260 caratteri. Nelle versioni successive di Windows è necessario modificare una chiave del Registro di sistema o usare lo strumento Criteri di gruppo per rimuovere il limite. Per informazioni dettagliate dettagliate, vedere Limitazione massima della lunghezza del percorso.
Namespaces (Spazi dei nomi)
Esistono due categorie principali di convenzioni dello spazio dei nomi usate nelle API di Windows, comunemente definite spazi dei nomi NT e spazi dei nomi Win32. Lo spazio dei nomi NT è stato progettato per essere lo spazio dei nomi di livello più basso in cui potrebbero esistere altri sottosistemi e spazi dei nomi, tra cui il sottosistema Win32 e, per estensione, gli spazi dei nomi Win32. POSIX è un altro esempio di sottosistema in Windows basato sullo spazio dei nomi NT. Nelle versioni precedenti di Windows sono stati definiti anche diversi nomi predefiniti o riservati per determinati dispositivi speciali, ad esempio le porte di comunicazione (seriale e parallela) e la console di visualizzazione predefinita come parte di ciò che è ora denominato spazio dei nomi del dispositivo NT e sono ancora supportati nelle versioni correnti di Windows per la compatibilità con le versioni precedenti.
Spazi dei nomi dei file Win32
I prefissi e le convenzioni dello spazio dei nomi Win32 sono riepilogati in questa sezione e nella sezione seguente, con descrizioni del modo in cui vengono usati. Si noti che questi esempi sono destinati all'uso con le funzioni API di Windows e non funzionano necessariamente con applicazioni della shell di Windows, ad esempio Esplora risorse. Per questo motivo esiste una gamma più ampia di percorsi possibili rispetto a quelli generalmente disponibili dalle applicazioni della shell di Windows e le applicazioni Windows che sfruttano questo vantaggio possono essere sviluppate usando queste convenzioni dello spazio dei nomi.
Per l'I/O del file, il prefisso "\?\" a una stringa di percorso indica alle API di Windows di disabilitare l'analisi di tutte le stringhe e di inviare la stringa che la segue direttamente al file system. Ad esempio, se il file system supporta percorsi di grandi dimensioni e nomi di file, è possibile superare i limiti di MAX_PATH che vengono altrimenti applicati dalle API di Windows.
Poiché disattiva l'espansione automatica della stringa di percorso, il prefisso "\?\" consente anche l'uso di ".." e "." nei nomi dei percorsi, che possono essere utili se si tenta di eseguire operazioni su un file con questi identificatori di percorso relativi altrimenti riservati come parte del percorso completo.
Molte API di I/O di file, ma non tutte, supportano "\\?\"; È consigliabile esaminare l'argomento di riferimento per ogni API per assicurarsi.
Si noti che le API Unicode devono essere usate per assicurarsi che il prefisso "\\?\" consenta di superare il MAX_PATH.
Spazi dei nomi dei dispositivi Win32
Il prefisso "\.\" accederà allo spazio dei nomi del dispositivo Win32 anziché allo spazio dei nomi dei file Win32. Questo è il modo in cui l'accesso a dischi fisici e volumi viene eseguito direttamente, senza passare attraverso il file system, se l'API supporta questo tipo di accesso. È possibile accedere a molti dispositivi diversi dai dischi in questo modo , ad esempio usando le funzioni CreateFile e DefineDosDevice .
Ad esempio, se si desidera aprire la porta di comunicazione seriale del sistema 1, è possibile usare "COM1" nella chiamata alla funzione CreateFile . Ciò funziona perché COM1-COM9 fa parte dei nomi riservati nello spazio dei nomi NT, anche se l'uso del prefisso "\.\\" funzionerà anche con questi nomi di dispositivo. Per confronto, se è installata una scheda di espansione seriale a 100 porte e si vuole aprire COM56, non è possibile aprirla utilizzando "COM56" perché non esiste alcuno spazio dei nomi NT predefinito per COM56. Sarà necessario aprirlo usando "\\.\COM56" perché "\.\.\" passa direttamente allo spazio dei nomi del dispositivo senza tentare di individuare un alias predefinito.
Un altro esempio di utilizzo dello spazio dei nomi del dispositivo Win32 consiste nell'usare la funzione CreateFile con "\.\PhysicalDriveX" (dove X è un valore intero valido) o "\.\CdRomX". In questo modo è possibile accedere direttamente a tali dispositivi, ignorando il file system. Ciò funziona perché questi nomi di dispositivo vengono creati dal sistema perché questi dispositivi vengono enumerati e alcuni driver creeranno anche altri alias nel sistema. Ad esempio, il driver di dispositivo che implementa il nome "C:\" ha un proprio spazio dei nomi che si verifica anche nel file system.
Le API che passano attraverso la funzione CreateFile in genere funzionano con il prefisso "\.\".\" perché CreateFile è la funzione usata per aprire sia file che dispositivi, a seconda dei parametri usati.
Se si usano le funzioni API di Windows, è consigliabile usare il prefisso "\.\\" per accedere solo ai dispositivi e non ai file.
La maggior parte delle API non supporterà "\.\"; solo quelli progettati per funzionare con lo spazio dei nomi del dispositivo lo riconosceranno. Controllare sempre l'argomento di riferimento per ogni API per assicurarsi.
Spazi dei nomi NT
Esistono anche API che consentono l'uso della convenzione dello spazio dei nomi NT, ma Gestione oggetti di Windows rende questo non necessario nella maggior parte dei casi. Per illustrare, è utile esplorare gli spazi dei nomi di Windows nel visualizzatore oggetti di sistema usando lo strumento Windows Sysinternals WinObj . Quando si esegue questo strumento, ciò che viene visualizzato è lo spazio dei nomi NT a partire dalla radice o "\". La sottocartella denominata "Global??" è la posizione in cui risiede lo spazio dei nomi Win32. Gli oggetti dispositivo denominati risiedono nello spazio dei nomi NT all'interno della sottodirectory "Device". Qui è anche possibile trovare Serial0 e Serial1, gli oggetti dispositivo che rappresentano le prime due porte COM, se presenti nel sistema. Un oggetto dispositivo che rappresenta un volume è simile a "HarddiskVolume1", anche se il suffisso numerico può variare. Il nome "DR0" nella sottodirectory "Harddisk0" è un esempio dell'oggetto dispositivo che rappresenta un disco e così via.
Per rendere questi oggetti dispositivo accessibili dalle applicazioni Windows, i driver di dispositivo creano un collegamento simbolico (collegamento simbolico) nello spazio dei nomi Win32, "Global??", ai rispettivi oggetti dispositivo. Ad esempio, COM0 e COM1 nella sottodirectory "Global??" sono semplicemente collegamenti simbolici a Serial0 e Serial1, "C:" è un collegamento simbolico a HarddiskVolume1, "Physicaldrive0" è un collegamento simbolico a DR0 e così via. Senza un collegamento simbolico, un dispositivo specificato "Xxx" non sarà disponibile per alcuna applicazione Windows usando le convenzioni dello spazio dei nomi Win32, come descritto in precedenza. Tuttavia, un handle può essere aperto a tale dispositivo usando qualsiasi API che supporti il percorso assoluto dello spazio dei nomi NT del formato "\Device\Xxx".
Con l'aggiunta del supporto multiutente tramite Servizi terminal e macchine virtuali, è diventato necessario virtualizzare ulteriormente il dispositivo radice a livello di sistema all'interno dello spazio dei nomi Win32. Questa operazione è stata eseguita aggiungendo il collegamento simbolico denominato "GLOBALROOT" allo spazio dei nomi Win32, che è possibile visualizzare nella sottodirectory "Global??" dello strumento browser WinObj descritto in precedenza e può accedere tramite il percorso "\\?\GLOBALROOT". Questo prefisso garantisce che il percorso che segue cerca il percorso radice del gestore oggetti di sistema e non un percorso dipendente dalla sessione.