Limitazione massima della lunghezza del percorso
Nell'API Windows (con alcune eccezioni descritte nei paragrafi seguenti), la lunghezza massima per un percorso è MAX_PATH, definita come 260 caratteri. Un percorso locale è strutturato nell'ordine seguente: lettera di unità, due punti, barra rovesciata, componenti dei nomi separati da barre rovesciate e un carattere Null di terminazione. Ad esempio, il percorso massimo nell'unità D è "D:\some 256-character path string<NUL>" dove "<NUL>" rappresenta il carattere null di terminazione invisibile per la tabella codici di sistema corrente. (Caratteri) <> vengono usati qui per chiarezza visiva e non possono far parte di una stringa di percorso valida.
Ad esempio, è possibile raggiungere questa limitazione se si clona un repository Git con nomi di file lunghi in una cartella con un nome lungo.
Nota
Le funzioni di I/O dei file nell'API di Windows convertno "/" in "\" come parte della conversione del nome in un nome in stile NT, tranne quando si usa il prefisso "\?\" come descritto nelle sezioni seguenti.
L'API Di Windows ha molte funzioni che dispongono anche di versioni Unicode per consentire un percorso di lunghezza estesa per una lunghezza totale massima di 32.767 caratteri. Questo tipo di percorso è costituito da componenti separati da barre rovesciate, ognuna fino al valore restituito nel parametro lpMaximumComponentLength della funzione GetVolumeInformation (questo valore è in genere 255 caratteri). Per specificare un percorso di lunghezza estesa, usare il prefisso "\\?\". Ad esempio, "\\?\D:\molto lungo percorso".
Nota
Il percorso massimo di 32.767 caratteri è approssimativo, perché il prefisso "\?\" può essere espanso in una stringa più lunga dal sistema in fase di esecuzione e questa espansione si applica alla lunghezza totale.
Il prefisso "\\?\" può essere usato anche con i percorsi costruiti in base alla convenzione di denominazione universale (UNC). Per specificare un percorso di questo tipo usando UNC, usare il prefisso "\\?\UNC\". Ad esempio, "\\?\UNC\server\share", dove "server" è il nome del computer e "condivisione" è il nome della cartella condivisa. Questi prefissi non vengono usati come parte del percorso stesso. Indicano che il percorso deve essere passato al sistema con modifiche minime, il che significa che non è possibile utilizzare barre per rappresentare i separatori di percorso o un punto per rappresentare la directory corrente o punti doppi per rappresentare la directory padre. Poiché non è possibile usare il prefisso "\\?\" con un percorso relativo, i percorsi relativi sono sempre limitati a un totale di MAX_PATH caratteri.
Non è necessario eseguire alcuna normalizzazione Unicode sulle stringhe di percorso e nome file per l'uso da parte delle funzioni API di I/O dei file di Windows perché il file system considera i nomi di percorso e file come una sequenza opaca di WCHARs. Qualsiasi normalizzazione necessaria per l'applicazione deve essere eseguita tenendo presente questo aspetto, esternamente a qualsiasi chiamata alle funzioni API di I/O dei file di Windows correlate.
Quando si usa un'API per creare una directory, il percorso specificato non può essere così lungo da non poter aggiungere un nome di file 8.3, ovvero il nome della directory non può superare MAX_PATH meno 12.
La shell e il file system hanno requisiti diversi. È possibile creare un percorso con l'API Windows che l'interfaccia utente della shell non è in grado di interpretare correttamente.
Abilitare percorsi lunghi in Windows 10, versione 1607 e successive
A partire da Windows 10 versione 1607, MAX_PATH limitazioni sono state rimosse da molte funzioni comuni di file e directory Win32. Tuttavia, l'app deve acconsentire esplicitamente al nuovo comportamento.
Per abilitare il nuovo comportamento di percorso lungo per applicazione, è necessario soddisfare due condizioni. È necessario impostare un valore del Registro di sistema e il manifesto dell'applicazione deve includere l'elemento longPathAware
.
Impostazione del Registro di sistema per abilitare percorsi lunghi
Importante
Comprendere che l'abilitazione di questa impostazione del Registro di sistema influirà solo sulle applicazioni modificate per sfruttare i vantaggi della nuova funzionalità. Gli sviluppatori devono dichiarare le proprie app in modo che siano consapevoli del percorso lungo, come descritto nelle impostazioni del manifesto dell'applicazione riportate di seguito. Questa non è una modifica che influirà su tutte le applicazioni.
Il valore HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
del Registro di sistema deve esistere e essere impostato su 1
. Il valore del Registro di sistema verrà memorizzato nella cache dal sistema (per processo) dopo la prima chiamata a una funzione di directory o file Win32 interessata (vedere di seguito per l'elenco delle funzioni). Il valore del Registro di sistema non verrà ricaricato durante la durata del processo. Affinché tutte le app del sistema riconoscano il valore, potrebbe essere necessario un riavvio perché alcuni processi potrebbero essere stati avviati prima dell'impostazione della chiave.
È anche possibile copiare questo codice in un .reg
file che può essere impostato automaticamente oppure usare il comando di PowerShell da una finestra del terminale con privilegi elevati:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Nota
Questa impostazione del Registro di sistema può essere controllata anche tramite Criteri di gruppo all'indirizzo Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
.
Aggiornamenti del manifesto dell'applicazione per dichiarare la funzionalità percorso lungo
Il manifesto dell'applicazione deve includere anche l'elemento longPathAware
.
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<ws2:longPathAware>true</ws2:longPathAware>
</windowsSettings>
</application>
Funzioni senza restrizioni MAX_PATH
Queste sono le funzioni di gestione delle directory che non hanno più restrizioni MAX_PATH se si acconsente esplicitamente al comportamento di percorso lungo: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.
Queste sono le funzioni di gestione dei file che non hanno più restrizioni MAX_PATH se si acconsente esplicitamente al comportamento del percorso lungo: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.