Mentre NTFS consente percorsi lunghi circa 32.000 caratteri, hai trovato la limitazione della lunghezza del percorso di 259 caratteri dell'API Win32 .
Nell'API di Windows (con alcune eccezioni discusse nel [documento collegato]), la lunghezza massima per un percorso è MAX_PATH
, che è definita come 260 caratteri.
(C'è inoltre un NULL
carattere di terminazione aggiunto al percorso, che ci fornisce 259 caratteri utilizzabili.)
Poiché Explorer (e quasi tutte le altre app di Windows) si basano sull'API Win32 per l'accesso al filesystem, non è pratico aggirare questa limitazione anche se è possibile :
L'API di Windows ha molte funzioni che hanno anche versioni Unicode per consentire un percorso di lunghezza estesa per una lunghezza totale del percorso massima di 32.767 caratteri. Questo tipo di percorso è composto da componenti separati da barre rovesciate, ciascuna fino al valore restituito nel lpMaximumComponentLength
parametro della GetVolumeInformation
funzione (questo valore è comunemente 255 caratteri). Per specificare un percorso di lunghezza estesa, utilizzare il prefisso "\\? \". Ad esempio, "\\? \ D: \ percorso molto lungo ".
Sfortunatamente, non puoi semplicemente digitare \\?\D:\very long path
in una finestra di Explorer. L'applicazione deve essere progettata per sfruttare queste API e gestire nomi di percorso molto lunghi.
Un modo per accedere a percorsi di lunghezza estesa in Windows è installare Cygwin , un livello di emulazione * nix per Windows. Nei miei test, Cygwin non sembra essere limitato da MAX_PATH
; bash e vi non hanno avuto problemi con percorsi lunghi 2000 caratteri.
Tieni presente che anche se puoi usare bash per sfogliare percorsi di lunghezza estesa, probabilmente non sarai in grado di aprire i file in quei percorsi nelle normali applicazioni Windows. Ad esempio, digitando notepad
mentre la directory di lavoro è un percorso di lunghezza estesa ti ottiene
Errore: la directory di lavoro corrente ha un percorso più lungo di quanto consentito per una directory di lavoro Win32. Impossibile avviare l'applicazione Windows nativa da qui.
E provare notepad "\\?\D:\very long path\file.txt"
non funziona neanche; si avvia, ma dice semplicemente "Impossibile trovare il file ..." Provare lo stesso con Notepad ++ lo blocca. (Probabilmente un buffer overflow.)
L'altra opzione per accedere a file specifici sepolti in profondità in un percorso di lunghezza estesa è quella di abbreviare il percorso stesso creando un punto di giunzione NTFS . Da un prompt dei comandi elevato:
D:\> mklink /J jct "\\?\D:\very\long\path"
Ora puoi accedere al contenuto di D:\very\long\path\
da D:\jct\
. Non colpirai alcun problema di lunghezza del percorso perché, per quanto riguarda Explorer e altre app, il percorso è giusto D:\jct\
(o qualunque cosa). Il driver NTFS gestisce il reindirizzamento del percorso (il "punto di analisi") in modo trasparente.
Il rovescio della medaglia di questo approccio è ovviamente che devi creare una giunzione vicino al file a cui vuoi accedere; non è ancora possibile sfogliare l'intera struttura della directory.
Per quanto riguarda i caratteri speciali ( " * : < > ? \ |
), è semplicemente un gioco da ragazzi. Quei personaggi hanno significati speciali all'interno di Windows, quindi non è possibile usarli all'interno di percorsi. (Cygwin ti consente di creare file con caratteri speciali, ma lo fa sostituendo i caratteri con caratteri Unicode speciali, che poi sostituisce durante la lettura. Visualizzare questi file creati da Cygwin sotto Linux o in Explorer non sembrerebbe giusto, dal momento che i caratteri Unicode non verrebbero sostituiti indietro.)
Detto questo, cosa stai facendo che richiede percorsi molto lunghi? Forse potresti semplificarti la vita rivalutando ciò che stai facendo ed evitando percorsi lunghi. Le probabilità sono che non hai bisogno di percorsi così lunghi comunque .