Benennen von Dateien, Pfaden und Namespaces
Alle Dateisysteme, die von Windows verwenden das Konzept von Dateien und Verzeichnissen für den Zugriff auf Daten, die auf einem Datenträger oder Gerät gespeichert sind. Windows, die mit den Windows-APIs für Datei- und Geräte-E/A arbeiten, sollten die verschiedenen Regeln, Konventionen und Einschränkungen von Namen für Dateien und Verzeichnisse verstehen.
Auf Daten kann über Datenträger, Geräte und Netzwerkfreigaben mithilfe von Datei-E/A-APIs zugegriffen werden. Dateien und Verzeichnisse sind zusammen mit Namespaces Teil des Konzepts eines Pfads, bei dem es sich um eine Zeichenfolgendarstellung handelt, an der die Daten unabhängig davon, ob sie von einem Datenträger, einem Gerät oder einer Netzwerkverbindung für einen bestimmten Vorgang übertragen werden, erhalten werden.
Einige Dateisysteme, z. B. NTFS, unterstützen verknüpfte Dateien und Verzeichnisse, die auch Dateinamenskonventionen und -regeln wie eine reguläre Datei oder ein normales Verzeichnis befolgen. Weitere Informationen finden Sie unter Hard Links and Junctions and Reparse Points and File Operations.
Weitere Informationen finden Sie in den folgenden Unterabschnitten:
Informationen zum Konfigurieren von Windows 10, um lange Dateipfade zu unterstützen, finden Sie unter Maximale Pfadlängenbeschränkung.
Datei- und Verzeichnisnamen
Alle Dateisysteme befolgen die gleichen allgemeinen Namenskonventionen für eine einzelne Datei: einen Basisdateinamen und eine optionale Erweiterung, getrennt durch einen Zeitraum. Jedes Dateisystem, z. B. NTFS, CDFS, exFAT, UDFS, FAT und FAT32, kann jedoch über spezifische und unterschiedliche Regeln für die Bildung der einzelnen Komponenten im Pfad zu einem Verzeichnis oder einer Datei verfügen. Beachten Sie, dass ein Verzeichnis einfach eine Datei mit einem speziellen Attribut ist, das es als Verzeichnis bezeichnet, aber andernfalls alle Benennungsregeln wie eine reguläre Datei befolgen muss. Da sich der Begriff Verzeichnis für das Dateisystem einfach auf einen speziellen Dateityp bezieht, wird für einige Referenzmaterialien der allgemeine Begriff Datei verwendet, um sowohl Konzepte von Verzeichnissen als auch Datendateien als solche zu umfassen. Aus diesem Grund sollten alle Benennungs- oder Verwendungsregeln oder Beispiele für eine Datei auch für ein Verzeichnis gelten, sofern nicht anders angegeben. Der Begriff Pfad bezieht sich auf ein oder mehrere Verzeichnisse, schräge Schrägstriche und möglicherweise auf einen Volumenamen. Weitere Informationen finden Sie im Abschnitt Pfade.
Einschränkungen der Zeichenanzahl können ebenfalls unterschiedlich sein und je nach verwendeter Dateisystem und Pfadnamenpräfixformat variieren. Dies wird durch die Unterstützung von Abwärtskompatibilitätsmechanismen noch komplizierter. Beispielsweise unterstützt das ältere MS-DOS FAT-Dateisystem maximal 8 Zeichen für den Basisdateinamen und 3 Zeichen für die Erweiterung, insgesamt 12 Zeichen einschließlich des Punkttrennzeichens. Dies wird im Allgemeinen als 8.3-Dateiname bezeichnet. Die Windows FAT- und NTFS-Dateisysteme sind nicht auf 8.3-Dateinamen beschränkt, da sie lange Dateinamen unterstützen, aber dennoch die Version 8.3 von langen Dateinamen unterstützen.
Namenskonventionen
Mit den folgenden grundlegenden Regeln können Anwendungen gültige Namen für Dateien und Verzeichnisse unabhängig vom Dateisystem erstellen und verarbeiten:
Verwenden Sie einen Zeitraum, um den Basisdateinamen von der Erweiterung im Namen eines Verzeichnisses oder einer Datei zu trennen.
Verwenden Sie einen schrägen Schrägstrich ( \ ), um die Komponenten eines Pfads zu trennen. Der schräge Schrägstrich teilt den Dateinamen vom Pfad zu ihm und ein Verzeichnisname von einem anderen Verzeichnisnamen in einem Pfad. Sie können keinen schrägen Schrägstrich im Namen der tatsächlichen Datei oder des Verzeichnisses verwenden, da es sich um ein reserviertes Zeichen handelt, das die Namen in Komponenten trennt.
Verwenden Sie je nach Bedarf einen zurücken Schrägstrich als Teil der Volumenamen, z. B. "C: \ " in "C: \ Pfaddatei" oder \ \ \ "Serverfreigabe" in "Serverfreigabepfaddatei" für \ \ \ \ \ \ Universal Naming Convention(UNC)-Namen. Weitere Informationen zu UNC-Namen finden Sie im Abschnitt Maximale Pfadlängenbeschränkung.
Gehen Sie nicht von der Sensitivität der Case-Sensitivität aus. Betrachten Sie z. B. die Namen "SOLLEN", "Sollen" und "Besen" als identisch, auch wenn einige Dateisysteme (z. B. ein POSIX-kompatibles Dateisystem) sie als unterschiedlich betrachten. Beachten Sie, dass NTFS die POSIX-Semantik für die Sensitivität von Fällen unterstützt, dies jedoch nicht das Standardverhalten ist. Weitere Informationen finden Sie unter CreateFile.
Bei Volumedesignatoren (Laufwerkbuchstaben) wird die Groß-/Kleinschreibung ebenfalls nicht beachtet. Beispielsweise verweisen "D: \ " und "d: \ " auf das gleiche Volume.
Verwenden Sie ein beliebiges Zeichen in der aktuellen Codepage für einen Namen, einschließlich Unicode-Zeichen und Zeichen im erweiterten Zeichensatz (128-255), mit Ausnahme der folgenden:
Die folgenden reservierten Zeichen:
- < (kleiner als)
- > (größer als)
- : (Doppelpunkt)
- " (doppeltes Anführungszeichen)
- / (Schrägstrich)
- \ (schräger Schrägstrich)
- | (senkrechter Strich oder senkrechte Striche)
- ? (Fragezeichen)
- * (Sternchen)
Ganzzahliger Wert 0 (null), manchmal auch als ASCII-NULL-Zeichen bezeichnet.
Zeichen, deren ganzzahlige Darstellungen im Bereich von 1 bis 31 liegen, mit Ausnahme alternativer Datenströme, in denen diese Zeichen zulässig sind. Weitere Informationen zu Dateistreams finden Sie unter File Streams.
Alle anderen Zeichen, die vom Zieldateisystem nicht zulässig sind.
Verwenden Sie einen Zeitraum als Verzeichniskomponente in einem Pfad, um das aktuelle Verzeichnis zu darstellen, z. B. ". \temp.txt". Weitere Informationen finden Sie unter Pfade.
Verwenden Sie zwei aufeinander folgende Punkte (..) als Verzeichniskomponente in einem Pfad, um das übergeordnete Element des aktuellen Verzeichnisses zu darstellen, 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 außerdem diese Namen, unmittelbar gefolgt von einer Erweiterung. Beispielsweise wird NUL.txt nicht empfohlen. Weitere Informationen finden Sie unter Namespaces.
Beenden Sie einen Datei- oder Verzeichnisnamen nicht mit einem Leerzeichen oder einem Zeitraum. Obwohl das zugrunde liegende Dateisystem solche Namen unterstützen kann, Windows Shell und Benutzeroberfläche nicht. Es ist jedoch akzeptabel, einen Zeitraum als erstes Zeichen eines Namens anzugeben. Beispiel: ".temp".
Kurze und lange Namen
Ein langer Dateiname wird als beliebiger Dateiname betrachtet, der die kurze Namenskonvention ms-DOS (auch als 8.3 bezeichnet) überschreitet. Wenn Sie einen langen Dateinamen erstellen, kann Windows auch eine kurze 8.3-Form des Namens erstellen, die als 8.3-Alias oder Kurzname bezeichnet wird, und sie auch auf dem Datenträger speichern. Dieses 8.3-Aliasing kann je nach Dateisystem aus Leistungsgründen entweder systemweit oder für ein angegebenes Volume deaktiviert werden.
Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: 8.3-Aliasing kann für angegebene Volumes erst Windows 7 und Windows Server 2008 R2 deaktiviert werden.
In vielen Dateisystemen enthält ein Dateiname eine Tilde (~) innerhalb jeder Komponente des Namens, die zu lang ist, um 8.3-Benennungsregeln zu entsprechen.
Hinweis
Nicht alle Dateisysteme folgen der Tildeersetzungskonvention, und Systeme können so konfiguriert werden, dass die 8.3-Aliasgenerierung deaktiviert wird, auch wenn sie diese normalerweise unterstützen. Gehen Sie daher nicht davon aus, dass der Alias 8.3 bereits auf dem Datenträger vorhanden ist.
Wenn Sie 8.3-Dateinamen, lange Dateinamen oder den vollständigen Pfad einer Datei vom System anfordern, sollten Sie die folgenden Optionen in Betracht ziehen:
- Um die Form 8.3 eines langen Dateinamens zu erhalten, verwenden Sie die GetShortPathName-Funktion.
- Verwenden Sie die GetLongPathName-Funktion, um die Version des langen Dateinamens eines Kurznamens zu erhalten.
- Verwenden Sie die GetFullPathName-Funktion, um den vollständigen Pfad zu einer Datei zu erhalten.
In 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 Dateiname immer beibehalten wird. Dies gilt auch, wenn ein langer Dateiname erweiterte Zeichen enthält, unabhängig von der Codepage, die während eines Lese- oder Schreibvorgang auf dem Datenträger aktiv ist.
Dateien, die lange Dateinamen verwenden, können zwischen NTFS-Dateisystempartitionen und Windows FAT-Dateisystempartitionen kopiert werden, ohne dass Dateinameninformationen verloren geht. Dies gilt abhängig vom tatsächlichen Dateinamen möglicherweise nicht für ältere MS-DOS FAT- und einige CDFS-Dateisysteme (CD-ROM). In diesem Fall wird nach Möglichkeit der kurze Dateiname ersetzt.
Paths
Der Pfad zu einer angegebenen Datei besteht aus einer oder mehreren Komponenten, die durch ein Sonderzeichen (einen schrägen Schrägstrich) getrennt sind, bei dem jede Komponente normalerweise ein Verzeichnis- oder Dateiname ist, aber mit einigen beachtensbekommenen Ausnahmen weiter unten. Es ist häufig wichtig für die Systeminterpretation eines Pfads, wie der Anfang bzw. das Präfix des Pfads aussieht. Dieses Präfix bestimmt den Namespace, den der Pfad verwendet, und darüber hinaus, welche Sonderzeichen an welcher Position innerhalb des Pfads verwendet werden, einschließlich des letzten Zeichens.
Wenn eine Komponente eines Pfads ein Dateiname ist, muss es sich um die letzte Komponente handelt.
Jede Komponente eines Pfads wird auch durch die maximale Länge eingeschränkt, die für ein bestimmtes Dateisystem angegeben ist. Im Allgemeinen lassen sich diese Regeln in zwei Kategorien unterteilen: short und long. Beachten Sie, dass Verzeichnisnamen vom Dateisystem als spezieller Dateityp gespeichert werden. Benennungsregeln für Dateien gelten jedoch auch für Verzeichnisnamen. Zusammengefasst ist ein Pfad einfach die Zeichenfolgendarstellung der Hierarchie zwischen allen Verzeichnissen, die für einen bestimmten Datei- oder Verzeichnisnamen vorhanden sind.
Vollqualifizierte und 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 einem der folgenden Beginnt:
- Ein UNC-Name eines beliebigen Formats, der immer mit zwei umgekehrten Schrägstrichen \ \ ("") beginnt. Weitere Informationen finden Sie im nächsten Abschnitt.
- Ein Datenträgerkennzeichner mit einem umgekehrten Schrägstrich, z. B. "C: \ " oder "d: \ ".
- Ein einzelner umgekehrter Schrägstrich, z. B. \ "verzeichnis" oder \ "file.txt". Dies wird auch als absoluter Pfad bezeichnet.
Wenn ein Dateiname nur mit einem Datenträgerkennzeichner beginnt, aber nicht mit dem umgekehrten Schrägstrich nach dem Doppelpunkt, wird er als relativer Pfad zum aktuellen Verzeichnis auf dem Laufwerk mit dem angegebenen Buchstaben interpretiert. Beachten Sie, dass das aktuelle Verzeichnis möglicherweise das Stammverzeichnis ist, je nachdem, auf was es während des letzten Vorgangs zum Ändern des Verzeichnisses auf diesem Datenträger festgelegt wurde. Beispiele für dieses Format:
- "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 des aktuellen Verzeichnisses auf Laufwerk C.
Ein Pfad wird auch als relativ bezeichnet, wenn er "doppelte Punkte" enthält. Das heißt, zwei Zeiträume zusammen in einer Komponente des Pfads. Dieser spezielle Bezeichner wird verwendet, um das Verzeichnis oberhalb des aktuellen Verzeichnisses zu kennzeichnen, das auch als "übergeordnetes Verzeichnis" bezeichnet wird. Beispiele für dieses Format:
- "..\tmp.txt" gibt eine Datei mit dem Namen tmp.txt an, die sich im übergeordneten Element des aktuellen Verzeichnisses befindet.
- "..\..\tmp.txt" gibt eine Datei an, die zwei Verzeichnisse oberhalb des aktuellen Verzeichnisses enthält.
- "..\ tempdir \tmp.txt" gibt eine Datei mit dem Namen tmp.txt an, die sich in einem Verzeichnis namens tempdir befindet, das ein Peerverzeichnis zum aktuellen 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 ein Laufwerk hat), unabhängig davon, welcher Laufwerkszeichner als aktuelles Laufwerk festgelegt ist.
Maximale Längenbeschränkung für Pfade
In Editionen von Windows vor Windows 10 Version 1607 beträgt die maximale Länge für einen Pfad MAX _ PATH, die als 260 Zeichen definiert ist. In späteren Versionen von Windows ist es erforderlich, einen Registrierungsschlüssel zu ändern oder das Gruppenrichtlinie Tool zu verwenden, um den Grenzwert zu entfernen. Ausführliche Informationen finden Sie unter Maximale Längenbeschränkung für Pfade.
Namespaces
Es gibt zwei Hauptkategorien von Namespacekonventionen, die in den Windows-APIs verwendet werden, die häufig als NT-Namespaces und win32-Namespaces bezeichnet werden. Der NT-Namespace wurde so konzipiert, dass er der namespace der niedrigsten Ebene ist, in dem andere Subsysteme und Namespaces vorhanden sein können, einschließlich des Win32-Subsystems und der Win32-Namespaces. POSIX ist ein weiteres Beispiel für ein Subsystem in Windows, das auf dem NT-Namespace basiert. Frühe Versionen von Windows auch mehrere vordefinierte oder reservierte Namen für bestimmte spezielle Geräte definiert, z. B. Kommunikationsports (seriell und parallel) und die Standardanzeigekonsole als Teil des jetzt als NT-Gerätenamespace bezeichneten , und werden in aktuellen Versionen von Windows aus Gründen der Abwärtskompatibilität weiterhin unterstützt.
Win32-Dateinamespaces
Die Präfixe und Konventionen für Win32-Namespaces werden in diesem abschnitt und im folgenden Abschnitt mit Beschreibungen ihrer Verwendung zusammengefasst. Beachten Sie, dass diese Beispiele für die Verwendung mit den Windows-API-Funktionen vorgesehen sind und nicht unbedingt mit Windows Shellanwendungen wie Windows Explorer funktionieren. Aus diesem Grund gibt es eine größere Bandbreite von möglichen Pfaden, als normalerweise über Windows Shellanwendungen verfügbar ist, und Windows Anwendungen, die dies nutzen, können mithilfe dieser Namespacekonventionen entwickelt werden.
Bei Datei-E/A weist das Präfix " \ \ ? " eine \ Pfadzeichenfolge an die Windows-APIs an, die gesamte Zeichenfolgen-Analyse zu deaktivieren und die darauf folgende Zeichenfolge direkt an das Dateisystem zu senden. 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 Pfadbegrenzung 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. Dies kann nützlich sein, wenn Sie versuchen, Vorgänge für eine Datei mit diesen ansonsten reservierten relativen Pfadspezifizierern als Teil des vollqualifizierten Pfads auszuführen.
Viele, aber nicht alle Datei-E/A-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 sie mit dem Präfix " \ \ ? " den MAXIMALEN PFAD \ überschreiten _ können.
Win32-Gerätenamespaces
Das Präfix " \ \ . " greift auf \ den Win32-Gerätenamespace statt auf den Win32-Dateinamespace zu. Auf diese Weise erfolgt der Zugriff auf physische Datenträger und Volumes direkt, ohne das Dateisystem zu durchlaufen, wenn die API diese Art von Zugriff unterstützt. Sie können auf diese Weise 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 die Verwendung des \ \ Präfixes " . " \ auch mit diesen Gerätenamen funktioniert. Wenn Sie dagegen ein serielles Erweiterungsboard mit 100 Ports 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 es mithilfe von \ \ öffnen. \ COM56" da " \ \ . " direkt zum \ Gerätenamespace wechselt, ohne einen vordefinierten Alias zu finden.
Ein weiteres Beispiel für die Verwendung des Win32-Gerätenamespaces ist die Verwendung der CreateFile-Funktion mit \ . \ \ PhysicalDisk X" (wobei X ein gültiger ganzzahliger Wert ist) oder " \ \ . \ CdRom X". Dadurch können Sie direkt auf diese Geräte zugreifen und dabei das Dateisystem umgehen. Dies funktioniert, da diese Gerätenamen vom System erstellt werden, während diese Geräte aufzählt werden, und einige Treiber auch andere Aliase im System erstellen. Beispielsweise verfügt der Gerätetreiber, der den Namen "C: \ " implementiert, über 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 verwendet wird, um Dateien und Geräte abhängig von den verwendeten Parametern zu öffnen.
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 entwickelt wurden, erkennen dies. Überprüfen Sie immer das Referenzthema für jede API, um sich zu vergewissern.
NT-Namespaces
Es gibt auch APIs, die die Verwendung der NT-Namespacekonvention zulassen, aber der Windows Objekt-Manager macht dies in den meisten Fällen überflüssig. Zur Veranschaulichung ist es hilfreich, die Windows Namespaces im Systemobjektbrowser mit dem winObj-Tool Windows Sysinternals zu durchsuchen. Wenn Sie dieses Tool ausführen, wird der NT-Namespace, der am Stamm beginnt, oder " \ " " angezeigt. Der Unterordner mit dem Namen "Global?". ist der Ort, an dem 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, sofern auf Ihrem System vorhanden. 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.
Damit diese Geräteobjekte für Windows Anwendungen zugänglich sind, erstellen die Gerätetreiber eine symbolische Verknüpfung (symlink) im Win32-Namespace "Global??" zu ihren jeweiligen Geräteobjekten. Beispiel: COM0 und COM1 unter "Global?". Unterverzeichnisse sind einfach symbolische Verknüpfungen mit Serial0 und Serial1, "C:" ist ein symbolischer Link zu HarddiskVolume1, "Physicaldrive0" ist ein symbolischer Link zu DR0 usw. Ohne symlink ist ein angegebenes Gerät "Xxx" für keine Windows Anwendung verfügbar, die Win32-Namespacekonventionen verwendet, wie zuvor beschrieben. Für dieses Gerät kann jedoch ein Handle mit allen APIs geöffnet werden, die den absoluten NT-Namespacepfad im Format \ "Device \ Xxx" unterstützen.
Durch die Hinzufügung der Unterstützung mehrerer Benutzer über Terminaldienste und virtuelle Computer ist es nun erforderlich, das systemweite Stammgerät im Win32-Namespace zu virtualisieren. Dies wurde erreicht, indem sie dem Win32-Namespace den symbolischen Link namens "GLOBALROOT" hinzugefügt hat, den Sie im "Global?"-Namespace sehen können. Unterverzeichnis des zuvor beschriebenen WinObj-Browsertools und zugriff über den Pfad " \ \ ? \ GLOBALROOT". Dieses Präfix stellt sicher, dass der darauf folgende Pfad im tatsächlichen Stammpfad des Systemobjekt-Managers und nicht in einem sitzungsabhängigen Pfad aussieht.