Limitazione massima lunghezza 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à, punti, barra rovesciata, componenti del nome separati da barre rovesciate e un carattere null finale. Ad esempio, il percorso massimo nell'unità D è "D:\qualche stringa di percorso <di 256 caratteriNUL" dove "<NUL>>" rappresenta il carattere null invisibile per la tabella di codice del sistema corrente. (I 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 file nell'API di Windows convertono "/" 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 Windows include molte funzioni che dispongono anche di versioni Unicode per consentire un percorso di lunghezza estesa per una lunghezza massima del percorso totale 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 è comunemente 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 tale percorso usando UNC, usare il prefisso "\\?\UNC\". Ad esempio, "\\?\UNC\server\share", dove "server" è il nome del computer e "share" è 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, che significa che non è possibile usare barre in avanti per rappresentare i separatori di percorso o un periodo per rappresentare la directory corrente o i 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 caratteri MAX_PATH .

Non è necessario eseguire alcuna normalizzazione Unicode nelle stringhe di percorso e nome file da usare dalle funzioni API di I/O file di Windows perché il file system considera i nomi di percorso e file come sequenza opaca di WCHARs. Qualsiasi normalizzazione necessaria per l'applicazione deve essere eseguita con 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 che non è possibile aggiungere un nome 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 Di Windows che l'interfaccia utente della shell non è in grado di interpretare correttamente.

Abilitare i percorsi lunghi in Windows 10, versione 1607 e versioni successive

A partire da Windows 10 versione 1607, le limitazioni MAX_PATH sono state rimosse dalle funzioni comuni di file e directory Win32. Tuttavia, è necessario acconsentire esplicitamente al nuovo comportamento.

Per abilitare il nuovo comportamento del percorso lungo, è necessario soddisfare entrambe le condizioni seguenti:

  • La chiave Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (Type: REG_DWORD) del Registro di sistema deve essere impostata su 1. Il valore della chiave verrà memorizzato nella cache dal sistema (per processo) dopo la prima chiamata a un file o una funzione directory Win32 interessata (vedere di seguito per l'elenco di funzioni). La chiave del Registro di sistema non verrà ricaricata durante la durata del processo. Per consentire a tutte le app del sistema di riconoscere il valore della chiave, potrebbe essere necessario un riavvio perché alcuni processi potrebbero essere stati avviati prima del set della chiave.

È anche possibile copiare questo codice in un .reg file che può essere impostato per l'utente 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 chiave del Registro di sistema può essere controllata anche tramite Criteri di gruppo in Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths.

  • Il manifesto dell'applicazione deve includere anche l'elementolongPathAware .

    <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>
    

Queste sono le funzioni di gestione delle directory che non hanno più restrizioni MAX_PATH se si opta per il 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 opta per il comportamento di percorso lungo: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileExW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.