Microsoft Developer Network > Forenhomepage > Allgemein Foren > Aus der MSDN Hotline: Häufig gestellte Fragen und deren Antworten > Aus der MSDN Hotline: Arbeiten mit Dateinamen und Dateipfade mit einer Länge größer als 260 Zeichen (.NET, C#)
Stellen Sie eine FrageStellen Sie eine Frage
 

Allgemeine DiskussionAus der MSDN Hotline: Arbeiten mit Dateinamen und Dateipfade mit einer Länge größer als 260 Zeichen (.NET, C#)

  • Freitag, 13. November 2009 09:37Atanas DimitrovModeratorTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     Enthält Code

    Hallo zusammen,

    heute wurde uns bei der MSDN Hotline unter anderem folgende Frage gestellt:
    Beim Versuch eine Datei mit Pfadlänge größer als 260 Zeichen zu kopieren, kriege ich eine Exception. Wie kann ich solche Dateien mit .NET (C#) koppieren?

    Unsere Antwort bzw. unser Lösungsvorschlag darauf war:
    Das Problem, das Sie haben, liegt an einer Limitierung, nämlich MAX_PATH in der Windows API. Die .NET Framework ist von der Windows API stark abhängig und deswegen existiert die 260-Zeichen-Limitierung auch hier.

    In der Windows API gibt es eine Möglichkeit, die MAX_PATH-Limitierung umzugehen, indem man das "\\?\"-Präfix vor dem Dateipfad verwendet und die Unicode Version der Windows API aufruft. In diesem Fall können Namen bzw. Pfade eine Länge von bis zu 32K Zeichen haben.

    Dieser Einsatz ist aber in .NET nicht direkt vorhanden, weil das "\\?\"-Präfix verschiedene Sicherheits-, Kompatibilitäts- und Inkonsistenzprobleme verursachen kann.

    Eine Möglichkeit, längere Dateinamen und Pfade zu verwenden, ist P/Invoke: die entsprechende Unicode Windows API-Funktion mit Präfix \\?\ aufzurufen.

    Das folgende Beispiel zeigt wie man P/Invoke verwenden kann, um eine Datei zu löschen:

    using System;
    using System.Runtime.InteropServices;
    
    [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool DeleteFile(string lpFileName);
    
    

     

    public static void Delete(string fileName) {
        string formattedName = @"\\?\" + fileName;
        DeleteFile(formattedName);
    }
    

    Weitere Informationen, Erläuterungen der Gründe für diese Limitierung, Richtlinien für Vermeidung des Problems und weitere Lösungsvorschläge finden Sie auf den folgenden Seiten:

    1. BCL Team Blog: Long Paths in .NET
    2. MSDN: Naming Files, Paths, and Namespaces

    Wollen Sie mehr über die Windows APIs lernen, besuchen Sie dann die folgende MSDN-Online Webseite:

    3. MSDN: Windows API

    Viele Grüße,
    Atanas Dimitrov
    MSDN Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN Hotline: http://www.msdn-online.de/Hotline 
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu Markenzeichen sowie die allgemein gültigen Informationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN Hotline.

Alle Antworten

  • Montag, 16. November 2009 00:06Klein, MarkusModeratorTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillenTeilnehmermedaillen
     
    Hallo zusammen,

    tztz, soviele schöne Links und keine Referenz zu meinem tollen Foreneintrag: PathToLongException bei Instanziierung der DirectoryInfo Klasse. Im übrigen, Windows unterstützt solch lange Pfade nicht. NTFS aber sehr wohl. Das \\?\-Präfix ist keine Magie die es Windows ermöglicht irgendwas zu tun was es normalerweise nicht kann, sondern es reicht den Pfad schlicht und ergreifend an NTFS weiter ohne sich drum zu kümmern. Wer sich jetzt fragt was passieren würde wenn solcher Code auf einem System ausgeführt wird, dass nicht mit NTFS sondern z.B. mit FAT32 läuft, beginnt zu erahnen warum man besser die Finger von solchen Späßen lassen sollte, bis man einen wirklich guten Grund hat.

    Gruß,
    Markus