Wie man mit Dateien mit Namen, die länger als 259 Zeichen?
Arbeite ich an einer Anwendung, die Spaziergänge durch jede Datei in einige Verzeichnisse und ein paar Aktionen mit diesen Dateien. Unter anderem muss ich die Datei abzurufen, die Größe und das Datum Wann diese Datei geändert wurde.
Einige Datei vollständigen Namen (Verzeichnis + Dateiname) ist zu lang, ich konnte nicht verwenden .NET Framework FileInfo
, beschränkt auf MAX_PATH
(260 Zeichen). Viele web-Quellen empfohlen, um native Win32-Funktionen über P/Invoke auf die Dateien zugreifen, deren Namen zu lang sind.
Derzeit genau das selbe problem scheint zu entstehen, mit Win32-Funktionen. Zum Beispiel GetFileAttributesEx
(kernel32.dll) nicht mit Win32-Fehler 3 ERROR_PATH_NOT_FOUND für den Pfad von 270 bytes.
Die gleiche Datei erfolgreich geöffnet werden Notepad2 und erfolgreich angezeigt mit dem Windows-Explorer (sondern Visual Studio 2010 zum Beispiel nicht zu öffnen, weil die 259 Zeichen grenze1).
Was kann ich tun, um Zugriff auf eine Datei, wenn die Datei Weg ist 270 Zeichen lang?
Hinweise:
-
Entfernen oder ignorieren von Dateien mit der Datei-Pfad Länge, die länger als 259 Zeichen ist keine Lösung.
-
Ich bin auf der Suche nach Unicode-kompatible Lösungen nur.
-
Die Anwendung läuft unter Windows 2008/Vista oder später mit .NET Framework 4 installiert.
1 Überraschend, Microsoft Word 2007 scheitert, beschwert sich, dass "die Diskette ist zu klein" auf einem computer, die nicht haben, die keinerlei floppy-Laufwerk, oder "RAM-Speicher ist niedrig", wenn es 4 GB RAM übrig, oder endlich, dass "antivirus-software [...] muss aktualisiert werden". Wird Sie aufhören, eines Tages Anzeige wie blöd bedeutungslos Fehler zumindest in solchen Schlüssel-Produkte wie Microsoft Office?
- Ich glaube, auch in diesen Tagen, dass jeder mit dem Namen maps zu einem 8.3 format-Dateinamen können nicht Sie nutzen? en.wikipedia.org/wiki/...
- Auch ein 8.3 format-Dateinamen können das mehr als 260 Zeichen haben, die Sie gerade brauchen, tief-Ordner verschachteln.
- Ich glaube nicht, Folgen Sie... Microsoft besitzt und ist direkt verantwortlich für den code, generiert Ihren Fehlermeldungen.
- Beachten Sie, dass Sie können (und wollen vielleicht, da es fügt I/O-overhead) deaktivieren der 8.3 Namen erstellen, also, Nein, Sie können nicht sicher sein, dass ein 8.3 existiert. Sehen
fsutil.exe 8dot3name
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
.NET 4.6.2 Lösung
Verwenden Sie die
\\?\C:\Verrrrrrrrrrrry long path
syntax wie beschrieben hier..NET-Core-Lösung
Es nur funktioniert, weil der Rahmen fügt sich der lange Pfad-syntax für Sie.
Vor .NET 4.6.2 Lösung
Auch mit den langen Pfad-syntax und die Unicode-version der Win32-API-Funktion mit P/Invoke.
Von Naming Files, Paths, and Namespaces:
Lesen dieser Microsoft Support-Seite könnte auch interessant sein.
Eine sehr umfangreiche Erklärung in Lange Wege im .NET von Kim Hamilton bei der BCL-Team blog Listen ein paar Probleme im Umgang mit diesen Pfaden, die er behauptet, sind der Grund, warum diese syntax wird noch nicht unterstützt .NET direkt:
Warnung: möglicherweise müssen Sie rufen Sie die Windows-APIs direkt, da ich denke, dass die .NET Framework möglicherweise nicht unterstützen diese Art von Pfad-syntax.
PathHelper
Klasse) überprüft den Pfad und wirft eine Ausnahme, wenn es mehr alsMAX_PATH
(260) Zeichen.Könnten Sie versuchen, die Delimon Bibliothek, seine eine .NET Framework 4-basierte Bibliothek auf der Microsoft TechNet-Website für die überwindung von langen Dateinamen problem:
Delimon.Win32.IO Library (V4.0).
Es hat seine eigenen Versionen der wichtigsten Methoden aus dem System.IO. Zum Beispiel, Sie würde ersetzen:
mit
denen Sie mit langen Dateien und Ordner.
Aus der website:
.NET-Core unterstützt nun lange Pfadnamen ohne erweiterte syntax.
Ich lief in dieses problem, wenn mit einer Anwendung, die ich Schreibe. Wenn ich war immer in der Nähe von schlagen die 260-Zeichen-limit, würde ich ein Netzlaufwerk, auf das Fliegen, ein segment, das voll Weg, so schneiden die Länge der vollständige Pfad + Datei-name deutlich nach. Es ist nicht wirklich eine elegante Lösung, aber es bekam den job zu erledigen.
Den MSDN-Referenz für GetFileAttributesEx sagt:
So, die Sie verwenden möchten GetFileAttributesExW Präfix und Ihren Pfad mit "\\?\"
Bitte aktualisieren Sie Ihre config-Datei wie folgt:
Schaffung einer separaten Prozess, verwendet Robocopy ist auch eine Lösung wie hier diskutiert:
So verschieben Sie Ordner/Dateien mit Pfadangaben > 255 Zeichen in Windows 8.1?
Gesehen in: Datei kopieren mit robo kopieren und verarbeiten
Lange Pfad ist eine sehr seltene Ausnahme und in der Regel nur ein oder ein paar Dateien mit langem Pfad existieren kann. Es ist daher nicht notwendig, um eine ganz neue Bibliothek nur für Sie.
Was können Sie stattdessen tun ist, zu ignorieren, die Dateien mit langen Pfaden. Beginnen Sie mit der Deklaration dieser Funktion:
Dann innerhalb der Schleife stellen Sie sicher, zu überspringen, lange Pfad-Dateien. Beispiel:
wenn(IsPathWithinLimits(name) == false) erkennt eine Datei mit einem langen Weg.