Benennen von Dateien, Pfaden und Namespaces

Alle von Windows unterstützten Dateisysteme verwenden das Konzept von Dateien und Verzeichnissen, um auf Daten zuzugreifen, die auf einem Datenträger oder Gerät gespeichert sind. Windows Entwickler, die mit den Windows APIs für Datei- und Geräte-I/O arbeiten, sollten die verschiedenen Regeln, Konventionen und Einschränkungen von Namen für Dateien und Verzeichnisse verstehen.

Auf Daten können über Datenträger, Geräte und Netzwerkfreigaben mithilfe von Datei-I/O-APIs zugegriffen werden. Dateien und Verzeichnisse, zusammen mit Namespaces, sind Teil des Konzepts eines Pfads, der eine Zeichenfolgendarstellung ist, wo die Daten abgerufen werden sollen, unabhängig davon, ob es sich um einen Datenträger oder ein Gerät oder eine Netzwerkverbindung für einen bestimmten Vorgang handelt.

Einige Dateisysteme, z. B. NTFS, unterstützen verknüpfte Dateien und Verzeichnisse, die auch Dateibenennungskonventionen und -regeln folgen, genauso wie eine reguläre Datei oder ein Verzeichnis. Weitere Informationen finden Sie unter "Hard Links and Junctions" und " Reparse Points and File Operations".

Weitere Informationen finden Sie in den folgenden Unterabschnitten:

Informationen zum Konfigurieren von Windows 10 zur Unterstützung langer Dateipfade finden Sie unter "Maximale Pfadlängenbeschränkung".

Datei- und Verzeichnisnamen

Alle Dateisysteme folgen den gleichen allgemeinen Benennungskonventionen für eine einzelne Datei: ein Basisdateiname und eine optionale Erweiterung, getrennt durch einen Zeitraum. Jedes Dateisystem, z. B. NTFS, CDFS, exFAT, UDFS, FAT und FAT32, kann jedoch bestimmte und unterschiedliche Regeln über die Bildung der einzelnen Komponenten im Pfad zu einem Verzeichnis oder einer Datei haben. Beachten Sie, dass ein Verzeichnis einfach eine Datei mit einem speziellen Attribut ist, das sie als Verzeichnis designiert, andernfalls jedoch alle gleichen Benennungsregeln wie eine reguläre Datei befolgen muss. Da das Ausdrucksverzeichnis einfach auf einen speziellen Dateityp verweist, was das Dateisystem betrifft, verwendet einige Referenzmaterial die allgemeine Ausdrucksdatei , um sowohl Konzepte von Verzeichnissen als auch Datendateien wie solche zu umfassen. Da dies nicht anders angegeben ist, sollte auch eine Benennungs- oder Nutzungsregeln oder Beispiele für eine Datei auf ein Verzeichnis angewendet werden. Der Ausdruckspfad bezieht sich auf ein oder mehrere Verzeichnisse, Backslashes und möglicherweise einen Volumennamen. Weitere Informationen finden Sie im Abschnitt "Pfade" .

Zeichenanzahlbeschränkungen können auch unterschiedlich sein und je nach dem verwendeten Dateisystem- und Pfadnamenpräfixformat variieren. Dies ist durch unterstützung von Abwärtskompatibilitätsmechanismen weiter kompliziert. Das ältere MS-DOS FAT-Dateisystem unterstützt beispielsweise maximal 8 Zeichen für den Basisdateinamen und 3 Zeichen für die Erweiterung, insgesamt 12 Zeichen einschließlich des Punkttrennzeichens. Dies ist häufig als 8.3-Dateiname bekannt. Die Windows FAT- und NTFS-Dateisysteme sind nicht auf 8.3-Dateinamen beschränkt, da sie lange Dateinamen unterstützen, aber sie unterstützen weiterhin die 8.3-Version von langen Dateinamen.

Namenskonventionen

Mit den folgenden grundlegenden Regeln können Anwendungen gültige Namen für Dateien und Verzeichnisse erstellen und verarbeiten, unabhängig vom Dateisystem:

  • Verwenden Sie einen Zeitraum, um den Basisdateinamen aus der Erweiterung im Namen eines Verzeichnisses oder einer Datei zu trennen.

  • Verwenden Sie einen Backslash (\), um die Komponenten eines Pfads zu trennen. Der Backslash teilt den Dateinamen von dem Pfad zum Pfad ab und einen Verzeichnisnamen aus einem anderen Verzeichnisnamen in einem Pfad. Sie können keinen Backslash im Namen für die tatsächliche Datei oder das Verzeichnis verwenden, da es sich um ein reserviertes Zeichen handelt, das die Namen in Komponenten trennt.

  • Verwenden Sie einen Backslash als Teil von Volumenamen, z. B. "C:\". in "C:\path\file" oder "\\server\share" in "\\server\share\path\file" für Universelle Benennungskonvention (UNC)-Namen. Weitere Informationen zu UNC-Namen finden Sie im Abschnitt "Maximale Pfadlängenbeschränkung ".

  • Gehen Sie nicht davon aus, dass die Groß-/Kleinschreibung beachtet wird. Betrachten Sie beispielsweise die Namen OSCAR, Oscar und Oscar als identisch, auch wenn einige Dateisysteme (z. B. ein POSIX-kompatibles Dateisystem) sie als anders betrachten können. Beachten Sie, dass NTFS POSIX-Semantik für die Groß-/Kleinschreibung unterstützt, dies ist jedoch nicht das Standardverhalten. Weitere Informationen finden Sie unter CreateFile.

  • Volume-Designatoren (Laufwerkbuchstaben) sind ähnlich groß- und kleinschreibungsfähig. Beispiel: "D:\" und "d:\" verweisen sie auf das gleiche Volumen.

  • Verwenden Sie jedes Zeichen auf der aktuellen Codeseite für einen Namen, einschließlich Unicode-Zeichen und Zeichen im erweiterten Zeichensatz (128-255), außer für folgendes:

    • Die folgenden reservierten Zeichen:

      • < (kleiner als)
      • > (größer als)
      • : (Doppelpunkt)
      • " (doppeltes Anführungszeichen)
      • / (Schrägstrich)
      • \ (umgekehrter Schrägstrich)
      • | (vertikale Balken oder Rohre)
      • ? (Fragezeichen)
      • * (Sternchen)
    • Ganzzahlwert Null, manchmal als ASCII-NUL-Zeichen bezeichnet.

    • Zeichen, deren ganzzahlige Darstellungen im Bereich von 1 bis 31 liegen, außer für alternative Datenströme, in denen diese Zeichen zulässig sind. Weitere Informationen zu Dateistreams finden Sie unter "Datei Streams".

    • Alle anderen Zeichen, die das Zieldateisystem nicht zulassen.

  • Verwenden Sie einen Zeitraum als Verzeichniskomponente in einem Pfad, um das aktuelle Verzeichnis darzustellen, z. B. ".\temp.txt". Weitere Informationen finden Sie unter "Pfade".

  • Verwenden Sie zwei aufeinander folgende Perioden (..) als Verzeichniskomponente in einem Pfad, um das übergeordnete Verzeichnis des aktuellen Verzeichnisses darzustellen, z. B. ".. \temp.txt". Weitere Informationen finden Sie unter "Pfade".

  • Verwenden Sie nicht die folgenden reservierten Namen für den Namen einer Datei:

    CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 und LPT9. Vermeiden Sie auch diese Namen, gefolgt von einer Erweiterung; beispielsweise wird NUL.txt nicht empfohlen. Weitere Informationen finden Sie unter Namespaces.

  • Beenden Sie keinen Datei- oder Verzeichnisnamen mit einem Leerzeichen oder einem Zeitraum. Obwohl das zugrunde liegende Dateisystem solche Namen unterstützen kann, wird die Windows-Shell und die Benutzeroberfläche nicht unterstützt. Es ist jedoch zulässig, einen Zeitraum als erstes Zeichen eines Namens anzugeben. Beispiel: ".temp".

Kurze und lange Namen

Ein langer Dateinamen gilt als beliebiger Dateiname, der die kurze MS-DOS (auch als 8.3 Bezeichnete Benennungskonvention bezeichnet) überschreitet. Wenn Sie einen langen Dateinamen erstellen, kann Windows möglicherweise auch ein kurzes 8.3-Formular des Namens erstellen, das als 8.3 Alias oder Kurzname bezeichnet wird, und speichern Sie sie auch auf dem Datenträger. Diese 8.3-Aliasing kann aus Leistungsgründen entweder systemweite oder für ein angegebenes Volume deaktiviert werden, je nach dem jeweiligen Dateisystem.

Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: 8.3 Aliasing kann für angegebene Volumes erst deaktiviert werden, wenn Windows 7 und Windows Server 2008 R2.

Bei vielen Dateisystemen enthält ein Dateinamen eine Tilde (~) in jeder Komponente des Namens, die zu lang ist, um 8.3-Benennungsregeln zu erfüllen.

Hinweis

Nicht alle Dateisysteme folgen der Tilde-Substitutionskonvention, und Systeme können so konfiguriert werden, dass die 8.3-Alias-Generation deaktiviert wird, auch wenn sie es normalerweise unterstützen. Machen Sie daher nicht die Annahme, dass der 8.3-Alias bereits auf dem Datenträger vorhanden ist.

 

Um 8.3-Dateinamen, lange Dateinamen oder den vollständigen Pfad einer Datei aus dem System anzufordern, sollten Sie die folgenden Optionen berücksichtigen:

Auf neueren Dateisystemen wie NTFS, exFAT, UDFS und FAT32 speichert Windows die langen Dateinamen auf dem Datenträger in Unicode, was bedeutet, dass der ursprüngliche lange Dateinamen immer beibehalten wird. Dies gilt auch dann, wenn ein langer Dateinamen erweiterte Zeichen enthält, unabhängig von der Codeseite, die während eines Datenträger-Lese- oder Schreibvorgangs aktiv ist.

Dateien mit langen Dateinamen können zwischen NTFS-Dateisystempartitionen und Windows FAT-Dateisystempartitionen kopiert werden, ohne dass Dateinameninformationen verloren gehen. Dies gilt möglicherweise nicht für die älteren MS-DOS FAT- und einige Arten von CDFS -Dateisystemen (CD-ROM), je nach dem tatsächlichen Dateinamen. In diesem Fall wird der kurze Dateinamen falls möglich ersetzt.

Pfade

Der Pfad zu einer angegebenen Datei besteht aus einer oder mehreren Komponenten, getrennt durch ein spezielles Zeichen (ein Backslash), wobei jede Komponente normalerweise ein Verzeichnisname oder Dateinamen ist, aber mit einigen wichtigen Ausnahmen unten beschrieben. Es ist oft wichtig, die Interpretation eines Systems eines Pfads, wie der Anfang oder präfix des Pfads aussieht. Dieses Präfix bestimmt den Namespace , den der Pfad verwendet, und darüber hinaus werden welche Sonderzeichen in der Position im Pfad verwendet werden, einschließlich des letzten Zeichens.

Wenn eine Komponente eines Pfads ein Dateinamen ist, muss es sich um die letzte Komponente handeln.

Jede Komponente eines Pfads wird auch durch die maximale Länge eingeschränkt, die für ein bestimmtes Dateisystem angegeben ist. Im Allgemeinen fallen diese Regeln in zwei Kategorien: kurz und lang. Beachten Sie, dass Verzeichnisnamen vom Dateisystem als spezieller Dateityp gespeichert werden, die Benennungsregeln für Dateien gelten jedoch auch für Verzeichnisnamen. Um zusammenzufassen, ist ein Pfad einfach die Zeichenfolgendarstellung der Hierarchie zwischen allen Verzeichnissen, die für eine bestimmte Datei oder einen bestimmten Verzeichnisnamen vorhanden sind.

Vollqualifizierte vs. relative Pfade

Für Windows API-Funktionen, die Dateien bearbeiten, können Dateinamen häufig relativ zum aktuellen Verzeichnis sein, während einige APIs einen vollqualifizierten Pfad erfordern. Ein Dateiname ist relativ zum aktuellen Verzeichnis, wenn er nicht mit einer der folgenden Schritte beginnt:

  • Ein UNC-Name eines beliebigen Formats, der immer mit zwei umgekehrten Schrägstrichzeichen ("\\") beginnt. Weitere Informationen finden Sie im nächsten Abschnitt.
  • Ein Datenträgerdesignator mit einem umgekehrten Schrägstrich, z. B. "C:\" oder "d:\".
  • Ein einzelner umgekehrter Schrägstrich, z. B. "\directory" oder "\file.txt". Dies wird auch als absoluter Pfad bezeichnet.

Wenn ein Dateiname nur mit einem Datenträgerdesignator, aber nicht mit dem umgekehrten Schrägstrich nach dem Doppelpunkt beginnt, wird er als relativer Pfad zum aktuellen Verzeichnis auf dem Laufwerk mit dem angegebenen Buchstaben interpretiert. Beachten Sie, dass das aktuelle Verzeichnis möglicherweise oder nicht das Stammverzeichnis ist, je nachdem, auf was er während des letzten Vorgangs "Änderungsverzeichnis" auf diesem Datenträger festgelegt wurde. Beispiele für dieses Format sind wie folgt:

  • "C:tmp.txt" bezieht sich auf eine Datei namens "tmp.txt" im aktuellen Verzeichnis auf Laufwerk C.
  • "C:tempdir\tmp.txt" bezieht sich auf eine Datei in einem Unterverzeichnis auf das aktuelle Verzeichnis auf Laufwerk C.

Ein Pfad ist auch relativ, wenn er "Double-Dots" enthält; das heißt, zwei Zeiträume in einer Komponente des Pfads. Dieser spezielle Bezeichner wird verwendet, um das Verzeichnis oberhalb des aktuellen Verzeichnisses zu kennzeichnen, andernfalls als "übergeordnetes Verzeichnis" bezeichnet. Beispiele für dieses Format sind wie folgt:

  • ".. \tmp.txt" gibt eine Datei namens tmp.txt im übergeordneten Verzeichnis des aktuellen Verzeichnisses an.
  • ".. \.. \tmp.txt" gibt eine Datei an, die zwei Verzeichnisse über dem aktuellen Verzeichnis befindet.
  • ".. \tempdir\tmp.txt" gibt eine Datei mit dem Namen tmp.txt in einem Verzeichnis namens tempdir an, das ein Peerverzeichnis für das aktuelle Verzeichnis ist.

Relative Pfade können beide Beispieltypen kombinieren, z. B. "C:..\tmp.txt". Dies ist nützlich, da das System zwar das aktuelle Laufwerk zusammen mit dem aktuellen Verzeichnis dieses Laufwerks nachverfolgt, aber auch die aktuellen Verzeichnisse in jedem der verschiedenen Laufwerkbuchstaben nachverfolgt (wenn Ihr System mehr als eins aufweist), unabhängig davon, welche Laufwerksdesignator als aktuelles Laufwerk festgelegt ist.

Maximale Längenbeschränkung für Pfade

In Editionen von Windows vor Windows 10 Version 1607 ist die maximale Länge für einen Pfad MAX_PATH, der als 260 Zeichen definiert ist. In späteren Versionen von Windows ist das Ändern eines Registrierungsschlüssels oder die Verwendung des Gruppenrichtlinie Tools erforderlich, um den Grenzwert zu entfernen. Ausführliche Informationen finden Sie unter "Maximale Pfadlängenbeschränkung ".

Namespaces

Es gibt zwei Hauptkategorien von Namespacekonventionen, die in den Windows-APIs verwendet werden, häufig als NT-Namespaces und die Win32-Namespaces bezeichnet. Der NT-Namespace wurde entwickelt, um den niedrigsten Namespace zu sein, auf dem andere Subsysteme und Namespaces vorhanden sein könnten, einschließlich des Win32-Subsystems und durch Erweiterung die Win32-Namespaces. POSIX ist ein weiteres Beispiel für ein Subsystem in Windows, das auf dem NT-Namespace basiert. Frühe Versionen von Windows definierten auch mehrere vordefinierte oder reservierte Namen für bestimmte spezielle Geräte wie Kommunikationsports (serielle und parallele) Ports und die Standardanzeigekonsole als Teil des jetzt als NT-Gerätenamespace bezeichneten und werden weiterhin in aktuellen Versionen von Windows zur Abwärtskompatibilität unterstützt.

Win32-Dateinamespaces

Das Präfix und die Konventionen des Win32-Namespaces werden in diesem Abschnitt und im folgenden Abschnitt mit Beschreibungen der Verwendung zusammengefasst. Beachten Sie, dass diese Beispiele für die Verwendung mit den Windows API-Funktionen vorgesehen sind und nicht alle unbedingt mit Windows Shellanwendungen wie Windows Explorer arbeiten. Aus diesem Grund gibt es eine breitere Palette möglicher Pfade als in der Regel aus Windows Shellanwendungen verfügbar, und Windows Anwendungen, die dies nutzen, können mithilfe dieser Namespacekonventionen entwickelt werden.

Bei Datei-I/O weist das Präfix "\\?\" einer Pfadzeichenfolge die Windows-APIs an, alle Zeichenfolgenanalyse zu deaktivieren und die Zeichenfolge zu senden, die direkt an das Dateisystem folgt. Wenn das Dateisystem beispielsweise große Pfade und Dateinamen unterstützt, können Sie die MAX_PATH Grenzwerte überschreiten, die andernfalls von den Windows-APIs erzwungen werden. Weitere Informationen zur normalen maximalen Pfadbeschränkung finden Sie im vorherigen Abschnitt maximale Pfadlängenbeschränkung.

Da die automatische Erweiterung der Pfadzeichenfolge deaktiviert wird, ermöglicht das Präfix "\\?\" auch die Verwendung von ".." und "." in den Pfadnamen, die nützlich sein können, wenn Sie versuchen, Vorgänge in einer Datei mit diesen andernfalls reservierten relativen Pfadbezeichnern als Teil des vollqualifizierten Pfads auszuführen.

Viele, aber nicht alle Datei-I/O-APIs unterstützen "\\?\"; Sie sollten sich das Referenzthema für jede API ansehen, um sicher zu sein.

Beachten Sie, dass Unicode-APIs verwendet werden sollten, um sicherzustellen, dass das Präfix "\\?\" die MAX_PATH

Win32-Gerätenamespaces

Das Präfix "\\.\" greift anstelle des Win32-Dateinamespaces auf den Win32-Gerätenamespace zu. Der Zugriff auf physische Datenträger und Volumes erfolgt direkt, ohne das Dateisystem zu durchlaufen, wenn die API diesen Zugriffstyp unterstützt. Sie können auf viele andere Geräte als Datenträger zugreifen (z. B. mithilfe der Funktionen CreateFile und DefineDosDevice ).

Wenn Sie beispielsweise den seriellen Kommunikationsport 1 des Systems öffnen möchten, können Sie "COM1" im Aufruf der CreateFile-Funktion verwenden. Dies funktioniert, da COM1-COM9 Teil der reservierten Namen im NT-Namespace sind, obwohl das Präfix "\\.\" auch mit diesen Gerätenamen funktioniert. Wenn Sie ein serielles Erweiterungsboard mit 100 Port installiert haben und COM56 öffnen möchten, können Sie es nicht mit "COM56" öffnen, da kein vordefinierter NT-Namespace für COM56 vorhanden ist. Sie müssen sie mithilfe von "\\.\COM56" öffnen, da "\\.\" direkt zum Gerätenamespace wechselt, ohne einen vordefinierten Alias zu suchen.

Ein weiteres Beispiel für die Verwendung des Win32-Gerätenamespaces ist die CreateFile-Funktion mit "\\.\PhysicalDriveX" (wobei X ein gültiger ganzzahliger Wert ist) oder "\\.\CdRomX". Dadurch können Sie direkt auf diese Geräte zugreifen, indem Sie das Dateisystem umgehen. Dies funktioniert, da diese Gerätenamen vom System erstellt werden, da diese Geräte aufgezählt werden, und einige Treiber erstellen auch andere Aliase im System. Beispiel: Der Gerätetreiber, der den Namen "C:\" implementiert. hat einen eigenen Namespace, der auch das Dateisystem ist.

APIs, die die CreateFile-Funktion durchlaufen, funktionieren in der Regel mit dem Präfix "\\.\", da CreateFile die Funktion ist, die zum Öffnen von Dateien und Geräten verwendet wird, je nachdem, welche Parameter Sie verwenden.

Wenn Sie mit Windows API-Funktionen arbeiten, sollten Sie das Präfix "\\.\" verwenden, um nur auf Geräte und nicht auf Dateien zuzugreifen.

Die meisten APIs unterstützen nicht "\\.\"; nur diejenigen, die für die Arbeit mit dem Gerätenamespace vorgesehen sind, erkennen sie. Überprüfen Sie immer das Referenzthema für jede API, um sicher zu sein.

NT-Namespaces

Es gibt auch APIs, die die Verwendung der NT-Namespacekonvention zulassen, aber der Windows Object Manager macht dies in den meisten Fällen unnötig. Um zu veranschaulichen, ist es nützlich, die Windows Namespaces im Systemobjektbrowser mit dem Tool Windows Sysinternals WinObj zu durchsuchen. Wenn Sie dieses Tool ausführen, wird der NT-Namespace angezeigt, der am Stamm oder "\" beginnt. Der Unterordner mit dem Namen "Global??" befindet sich dort, wo sich der Win32-Namespace befindet. Benannte Geräteobjekte befinden sich im NT-Namespace im Unterverzeichnis "Device". Hier finden Sie möglicherweise auch Serial0 und Serial1, die Geräteobjekte, die die ersten beiden COM-Ports darstellen, wenn sie auf Ihrem System vorhanden sind. Ein Geräteobjekt, das ein Volume darstellt, wäre etwa "HarddiskVolume1", obwohl das numerische Suffix variieren kann. Der Name "DR0" unter dem Unterverzeichnis "Harddisk0" ist ein Beispiel für das Geräteobjekt, das einen Datenträger darstellt usw.

Um diese Geräteobjekte durch Windows Anwendungen zugänglich zu machen, erstellen die Gerätetreiber einen symbolischen Link (Symlink) im Win32-Namespace "Global??", zu ihren jeweiligen Geräteobjekten. Beispielsweise sind COM0 und COM1 unter dem Unterverzeichnis "Global??" einfach symlinks zu Serial0 und Serial1, "C:" ist ein Symlink zu HarddiskVolume1, "Physicaldrive0" ist ein Symlink zu DR0 usw. Ohne symlink ist ein angegebenes Gerät "Xxx" nicht für Windows Anwendung mit Win32-Namespacekonventionen verfügbar, wie zuvor beschrieben. Ein Handle könnte jedoch mit allen APIs geöffnet werden, die den absoluten NT-Namespacepfad des Formats "\Device\Xxx" unterstützen.

Mit der Ergänzung der Mehrbenutzerunterstützung über Terminaldienste und virtuelle Computer ist es weiter erforderlich, das systemweite Stammgerät im Win32-Namespace zu virtualisieren. Dies wurde erreicht, indem Sie den Symlink namens "GLOBALROOT" zum Win32-Namespace hinzufügen, den Sie im Unterverzeichnis des zuvor beschriebenen WinObj-Browsertools sehen können und über den Pfad "\\?\GLOBALROOT" zugreifen können. Dieses Präfix stellt sicher, dass der Pfad, der darauf folgt, im wahren Stammpfad des Systemobjekt-Managers und nicht im sitzungsabhängigen Pfad aussieht.

Vergleich der Dateisystemfunktionen