2011-08-22 9 views
9

Ho file sul mio disco rigido che generano un PathTooLongException quando accedo alla proprietà Fullname di un oggetto FileSystemInfo. C'è un modo per aggirare questo (esclusa la ridenominazione dei file che non è un'opzione)?Un modo per aggirare l'eccezione PathTooLongException che FileSystemInfo.Fullname genera a volte?

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath detto da altri risposte suggerisce di mettere un "\? \" Il prefisso del nome del file, ma in questo caso il DirectoryInfo.GetFileSystemInfos() è responsabile della creazione dei FileSystemInfo oggetti e DirectoryInfo non accetta tale prefisso quindi non c'è modo di usarlo .

La risposta "PathTooLongException in C# code" non è utile in quanto si tratta di un'applicazione multithreading e non è possibile continuare a modificare il percorso dell'applicazione corrente.

Devo davvero fare tutto con PInvoke solo per poter leggere tutti i file sul disco rigido?

+1

Hai provato: http://www.codeproject.com/KB/files/LongFileNames.aspx? –

risposta

3

Questo sembra interessante ... Codeplex Long Path Wrapper

Il lungo percorso involucro fornisce la funzionalità per rendere più facile lavorare con percorsi che sono più lungo del limite di 259 caratteri corrente dello spazio dei nomi System.IO. Utilizzando le classi di percorso lungo, i progetti ora possono utilizzare percorsi fino a 32.000 caratteri.

Darò una prova, anche se prendo nota immediatamente non fornisce un metodo equivalente a DirectoryInfo.GetFileSystemInfos() quindi avrà bisogno di alcune modifiche.

2

Non ci sono molti programmi che possono sopravvivere in un percorso più grande di 259 caratteri. Limite piuttosto difficile per il livello winapi, MAX_PATH è ovunque. È stato considerato per .NET ma senza risultati concreti. Blog post serie ends here con link a voci precedenti in basso.

2

Il corretto funzionamento con percorsi lunghi non è così difficile - ad esempio, lo fa SetACL. Ma:

  • le classi del framework .NET non supportano i percorsi lunghi quindi non è possibile utilizzarli
  • è necessario scrivere un wrapper per ogni funzione del sistema di file API in modo che utilizzi il percorso lungo corretto sia per l I percorsi UNC

Ecco la documentazione su MSDN sui percorsi lunghi: http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx

1

A partire da Windows 10 (o Windows Server 2016) e .Net 4.6.2, i percorsi lunghi possono essere supportati direttamente se un'impostazione del Registro di sistema è attivata e l'applicazione è contrassegnata come "long path aware".

L'impostazione si può accedere tramite criteri di gruppo locali (gpedit.msc), sotto Configurazione computer>Modelli amministrativi>Tutte le impostazioni>Attiva Win32 percorsi lunghi

Al fine di segnare il tuo applicazione come "long path aware", aggiungi questa sezione al file manifest:

<application xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <windowsSettings> 
    <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> 
    </windowsSettings> 
</application> 

Addizionalmente lly, se l'applicazione si rivolge a una versione del framework .Net prima di quanto 4.6.2, è necessario aggiungere una sezione al file App.config:

<configuration> 
    <runtime> 
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" /> 
    </runtime> 
</configuration> 

Per ulteriori informazioni si veda:
https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/ https://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx

(Per quanto ne so, questo riguarda solo le API di base del filesystem di Windows. Le API non file system possono essere ancora limitate a 260 caratteri)