2009-02-09 8 views
42

Wir sind ständig in dieses Problem ...Wie kann System.IO.PathTooLongException vermieden werden?

Beispiel:

wenn ich eine Datei, die ich in ein ein anderes Verzeichnis oder UNC-Freigabe und wenn die Länge des Wegs 248 kopieren möchten überschreitet (wenn Ich irre mich nicht), dann wird PathTooLongException ausgelöst. Gibt es eine Problemumgehung für dieses Problem?

PS: Gibt es Registrierungseinstellung, um diesen Pfad zu einem längeren Zeichensatz festzulegen?

+0

MAX_PATH 260 ist, die Kombination des Servers/der Freigabe macht es wahrscheinlich in Ihrem Fall 248. – user7116

+0

jede endgültige Lösung mit voller Quellcode-Probe darüber arbeiten? – Kiquenet

+1

Ich habe herausgefunden, dass maxpath nicht wirklich 260, sondern 259 ist. – brighty

Antwort

14

beschrieben Wie in Jeremy Kuhne blog, .NET Framework 4.6.2 entfernt die MAX_PATH Einschränkung, soweit möglich, ohne die Abwärtskompatibilität zu brechen.

9

Dies wurde durch die BCL-Team eingehend diskutiert worden ist, finden Sie in der blog entries

In Essenz gibt es keine Möglichkeit, dies zu tun innerhalb .Net-Code und bleiben Sie bei der BCL. Zu viele Funktionen beruhen darauf, dass der Pfadname kanonisiert werden kann (was sofort die Verwendung von Funktionen auslöst, die erwarten, dass MAX_PATH befolgt wird).

Sie könnten alle Win32-Funktionen, die die "\\?" -Syntax unterstützen, umhüllen, mit denen Sie in der Lage wären, eine Reihe von Funktionen mit langem Pfad zu implementieren, aber dies wäre umständlich.

Da eine große Anzahl von Werkzeugen (einschließlich Explorer [1]) kann lange Pfadnamen nicht umgehen ist es nicht ratsam, diesen Weg zu gehen, es sei denn, Sie sind glücklich, dass alle Interaktion mit dem resultierenden Dateisystem über Ihre Bibliothek geht (oder die begrenzte Anzahl von Werkzeugen, die dafür gebaut werden, wie Robocopy)

Als Antwort auf Ihre spezifischen Bedürfnisse würde ich untersuchen, ob die Verwendung von Robocopy direkt ausreichen würde, um diese Aufgabe zu erfüllen.

[1] Vista hat Möglichkeiten, um das Problem mit etwas Phantasie Umbenennung unter der Haube zu mildern, aber das ist bestenfalls zerbrechlich)

2

Das Problem ist mit den ANSI-Versionen des Windows-APIs. Eine Lösung, die sorgfältig getestet werden muss, ist die Verwendung von Unicode-Versionen der Windows-API. Dies kann durch Voranstellen von "\\?\" an den abgefragten Pfad erfolgen.

0

In C# für mich ist das eine Abhilfe:

/*make long path short by setting it to like cd*/ 
string path = @"\\godDamnLong\Path\"; 
Directory.SetCurrentDirectory(path); 
+0

Problem ist, dass alles, was erwartet, Dateien innerhalb des Verzeichnisses zu verwenden, auch erwarten wird, den echten (vollständigen, absoluten) Namen dieser Dateien zu erhalten, der irgendwann länger als MAX_PATH Zeichen sein wird. – cHao

+0

meinst du wenn der Dateiname länger ist als der max_path? Ich denke nicht, dass das überhaupt möglich ist. alles andere kannst du Schritt für Schritt dorthin gehen, wie in cmd "cd home", dann "cd subfolderOfHome" etc. vielleicht musst du ein bisschen tricksen aber es ist alles möglich wenn du mich fragst ... – CodingYourLife

+1

Ein Dateiname, der länger als MAX_PATH Zeichen ist, ist möglich. Win32 bietet Möglichkeiten zum Erstellen von Dateien mit einem Pfad über 32k Zeichen lang. (MAX_PATH ist ungefähr so ​​wie 260 von Windows 7.) Der Standard ist jedoch zu beschränken. Ob .net lässt Sie ... das ist die große Frage, und es sieht nicht so aus, als ob es beantwortet. – cHao

10

Versuchen Sie diese: Delimon.Win32.I O Library (V4.0)Diese Libarary ist auf .NET Framework 4.0 geschrieben

Delimon.Win32.IO ersetzt Basic Dateifunktionen von System.IO und unterstützt Datei & Ordnernamen bis zu 32.767 Zeichen.

https://gallery.technet.microsoft.com/DelimonWin32IO-Library-V40-7ff6b16c

Diese Bibliothek speziell lange Pfad & Dateinamen zu verwenden, geschrieben wird, um die Begrenzung des .NET Framework zu überwinden. Mit dieser Bibliothek Sie programmatisch durchsuchen können, den Zugang, Schreiben, Löschen, usw. Dateien und Ordner, die nicht zugänglich von der System.IO namespace.Library sind

Nutzungs

  1. zuerst einen Verweis auf die hinzufügen Delimon.Win32.IO.dll zu einem Projekt (Wechseln Sie zu der Delimon.Win32.IO.dll Datei)

  2. in Ihrer code-Datei hinzufügen "kann Delimon.Win32.IO"

  3. Verwenden Sie normale Datei & Directory-Objekte, als ob Sie mit System.IO

    arbeiten
+2

Dies ist eine großartige Bibliothek, danke fürs Teilen. Sie sollten es auf NuGet setzen. – jugg1es

+2

Diese Bibliothek ist großartig, aber warum bietet Microsoft keine native Unterstützung für alles, was das Dateisystem tatsächlich verarbeiten kann? – Erik

+1

Ich muss ZipFile.OpenRead() verwenden, die die Delimon.dll nicht unterstützt. Lösung hat die Datei mit Delimon in ein/temp-Verzeichnis kopiert und anschließend ZipFile.OpenRead() verwendet. Nur wenn jemand ein ähnliches Problem hat ... – selmaohneh

0

My Drive-Mapping-Lösung funktioniert gut und stabil „NetWorkDrive.cs“ und „NetWorkUNCPath.cs“ verwendet, die aus https://www.mycsharp.de/wbb2/thread.php?postid=3807703#post3807703

Testbeispiel heruntergeladen werden kann:

if (srcFileName.Length > 260) 
{ 
    string directoryName = srcFileName.Substring(0, srcFileName.LastIndexOf('\\')); 

    var uncName = GetUNCPath(srcFileName.Substring(0, 2)) + directoryName.Substring(2); 

    using (NetWorkDrive nDrive = new NetWorkDrive(uncName)) 
    { 
    drvFileName = nDrive.FullDriveLetter + Path.GetFileName(sourceFileName) 
    File.Copy(drvFileName, destinationFileName, true); 
    } 
} 
else 
{ 
    File.Copy(srcFileName, destinationFileName, true); 
} 
Verwandte Themen