2012-06-13 23 views
5

Sono in esecuzione un programma molto semplice, che sta cercando di elencare i file in una cartella sulla stessa macchina, che è specificato utilizzando il formato UNC (come descritto in http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx):Il percorso UNC non funziona con .NET?


static string rootDir = @"\\?\d:\share\input";

static void Main(string[] args) { char[] invlidChars = Path.GetInvalidPathChars(); foreach (char invChar in invlidChars) { if (rootDir.Contains(invChar.ToString())) { Console.WriteLine("InvChar - {0}", invChar); } } string[] matchFiles = Directory.GetFiles(rootDir); }

Tuttavia Directory.GetFiles() non funziona e genera un'eccezione ArgumentException (che viene generata quando - il percorso è una stringa di lunghezza zero, contiene solo uno spazio bianco o contiene uno o più caratteri non validi come definito da InvalidPathChars.). Console.Writeline() non stampa nulla, il che conferma che non ci sono caratteri non validi nel percorso. Ricevo la stessa eccezione quando uso "\\ UNC \? \ D: \ share \ input" o "\\ UNC \? \ Machinename \ share \ input" o "\\? \ Machinename \ share \ input ".

"d: \ share \ input" è in effetti una cartella condivisa.

Qualcuno sa cosa potrebbe essere sbagliato?

Grazie!

+0

Raccomando questa panoramica precedente ma ancora valida sui percorsi lunghi, la limitazione MAXPATH, il prefisso \\? \ E altri problemi .NET: http://blogs.msdn.com/b/bclteam/archive/2007/02/ 13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx –

+0

Grazie per il link Avner SK; Questo chiarisce il comportamento di .NET e Windows-API con percorsi lunghi. – whywhywhy

risposta

8

Il problema è che \\?\ è una convenzione API di Windows che non è supportata da .NET. Se si legge con attenzione il tuo link \\?\ non denota un percorso UNC, ma è una convenzione speciale per le finestre API:

Per file di I/O, il "\\?\" prefisso per una stringa di percorso racconta le API di Windows per disabilitare tutto l'analisi delle stringhe e per inviare la stringa che segue direttamente al file system.

Un formato UNC compatibile con .NET è \\machinename\d$\share\input. Vedere la risposta this per maggiori informazioni.

Il motivo per cui non è supportato da .NET è molto probabile che la convenzione del percorso esteso non sia disponibile su tutte le piattaforme e pertanto non possa essere garantito il funzionamento da parte del framework.

+0

Grazie per la risposta Mike Z. Come si fa notare in effetti \\? \ Non fa parte di UNC ma è specifico per Windows. Questo risponde alla domanda! – whywhywhy

Problemi correlati