2008-12-04 13 views
12

Ich stieß auf eine c-Bibliothek zum Öffnen von Dateien mit einem Unicode-Dateinamen. Bevor die Datei geöffnet wird, wird zuerst der Dateiname in einen Pfad konvertiert, indem "\\? \" Vorangestellt wird. Gibt es einen Grund, dies zu tun, außer die maximal zulässige Anzahl von Zeichen im Pfad zu erhöhen, pro this msdn article?Unter Windows, wann sollten Sie das Dateinamen-Präfix "\\? \" verwenden?

Es sieht so aus, als ob diese "\\? \" Pfade die Unicode-Versionen der Windows-API und der Standardbibliothek erfordern.

+0

Zusätzlich zu den Längenbeschränkungen können Sie auch Zeiträume und Leerzeichen in Dateinamen ohne Einschränkung verwenden. Zum Beispiel können Sie eine Datei mit dem Namen '..' haben, wenn Sie möchten, – Antimony

Antwort

9

Ja, es ist nur für diesen Zweck. Wenn Sie sich jedoch entscheiden, Pfade über die Länge von MAX_PATH zu erstellen, werden wahrscheinlich Kompatibilitätsprobleme auftreten. Zum Beispiel können die Explorer-Shell und die Eingabeaufforderung (zumindest unter XP, ich weiß nicht, über Vista) Pfade über diese Länge nicht behandeln und Fehler zurückgeben.

1

Ich habe Windows-Code seit 1995 geschrieben, und obwohl ich dieses Präfix kenne, habe ich nie einen Grund gefunden, es zu verwenden. Es scheint der einzige Grund dafür zu sein, die Pfadlänge über MAX_PATH hinaus zu erhöhen, und weder ich noch die Kunden meines Programms haben es meines Wissens jemals getan.

3

Ich denke, das erste, was zu beachten ist, dass "\\? \" Den Pfad nicht zu einem UNC-Pfad macht. Sie waren genauer das zweite Mal, als Sie es einen UNC-Stil Weg nannten. Aber selbst dann kommt die Ähnlichkeit nur von zwei Backslashes am Anfang. Es hat wirklich nichts mit UNC zu tun. Das wird durch die Tatsache unterstützt, dass Sie noch mehr Zeichen verwenden müssen, um einen UNC-Pfad mit dem Präfix "\\? \" Zu erhalten.

Ich denke, Sie haben den ganzen Grund für die Verwendung dieses Präfix. Es hebt die maximale Länge, wie in dem Artikel beschrieben, den Sie zitiert haben. Und es gilt nur für Unicode-Pfade; Nicht-Unicode-Pfade können das Limit nicht umgehen, indem sie dieses Präfix verwenden.

Eine Sache zu beachten ist, dass das Präfix für relative Pfade nicht erlaubt ist, nur für absolute. Sie sollten überprüfen, ob Ihre C-Bibliothek diese Einschränkung berücksichtigt.

5

Die beste Verwendung für diese Methode besteht wahrscheinlich nicht darin, neue Dateien zu erstellen, sondern vorhandene Dateien zu verwalten, die jemand anders möglicherweise erstellt hat.

Ich verwaltet einen Dateiserver, der routinemäßig Dateien mit path_length > MAX_PATH erhalten würde. Sie sehen, die Benutzer sahen die Dateien als H:\myfile.txt, aber auf dem Server war es tatsächlich H:\users\username\myfile.txt. Wenn also ein Benutzer eine Datei mit genau MAX_PATH Zeichen erstellt hat, war es auf dem Server MAX_PATH+len("users\username").

(Das Erstellen einer Datei mit MAX_PATH-Zeichen ist nicht so ungewöhnlich, da beim Speichern einer Webseite im Internet Explorer der Seitentitel als Dateiname verwendet wird, der für einige Seiten recht lang sein kann).

Auch teilen Sie ein Laufwerk (über Netzwerk oder USB) mit einem Mac oder einem Linux-Rechner, können Sie sich mit Dateien mit Namen wie con, prn oder lpt1 finden. Und wieder, das Präfix lässt Sie und Ihre Skripte mit diesen Dateien umgehen.

+1

Richtig, es deaktiviert mehr Verarbeitung als nur die Längenprüfung. (Zitat) an das System mit minimalen Änderungen übergeben, was bedeutet, dass Sie keine Schrägstriche verwenden können, um Pfadtrennzeichen darzustellen, oder einen Punkt, um das aktuelle Verzeichnis darzustellen, oder doppelte Punkte, um das übergeordnete Verzeichnis darzustellen. Da Sie das Präfix "\\? \" Nicht mit einem relativen Pfad verwenden können, sind relative Pfade immer auf insgesamt MAX_PATH-Zeichen beschränkt. (/ Zitat) –

3

Neben den längeren Pfaden können Sie mit dem Präfix "\\? \" Auch Dateien und Verzeichnisnamen wie "con" und "aux" verwenden. Normalerweise würde Windows diese als altmodische DOS-Geräte interpretieren.