Frage

Wenn ich ein char-Array (in C) zuweisen möchte, das garantiert groß genug ist, um einen gültigen absoluten Pfad + Dateinamen aufzunehmen, wie groß muss es sein?

Unter Win32 gibt es die Definition MAX_PATH.Was ist das Äquivalent für Unix/Linux?

War es hilfreich?

Lösung

Es gibt eine PATH_MAX, aber es ist ein bisschen problematisch. Vom Bugs Abschnitt der realpath (3) Manpage:

  

Die POSIX.1-2001 Standard-Version dieser Funktion wird gebrochen durch   Design, da es unmöglich ist, eine geeignete Größe für die bestimmen   Ausgangspuffer, resolved_path . Nach POSIX.1-2001 einem Puffer von   Größe PATH_MAX genügt, aber PATH_MAX muss kein definiert werden   Konstante und pathconf (3) verwendet werden müssen, erhalten wird, kann . Und   fragen pathconf (3) nicht wirklich helfen, da auf einerseits   POSIX warnt davor, dass das Ergebnis der pathconf (3) sehr groß sein kann und   ungeeignet für mallocing Speicher und auf der anderen Seite    pathconf (3) zurückgeben -1 dass PATH_MAX ist nicht   begrenzt.

Andere Tipps

Die anderen Antworten scheinen bisher alle recht zu haben, was die *nix-Seite betrifft, aber ich werde unter Windows eine Warnung dazu hinzufügen.

Sie wurden von der Dokumentation (durch Unterlassung) belogen.

MAX_PATH ist tatsächlich definiert und gilt wahrscheinlich sogar für Dateien, die auf FAT oder FAT32 gespeichert sind.Allerdings kann jedem Pfadnamen ein Präfix vorangestellt werden \\?\ um der Windows-API mitzuteilen, dass sie ignorieren soll MAX_PATH und lassen Sie den Dateisystemtreiber seine eigene Entscheidung treffen.Danach werden die Definitionen unscharf.

Hinzu kommt die Tatsache, dass Pfadnamen tatsächlich Unicode sind (also UTS-16) und dass bei Verwendung der „ANSI“-API die Konvertierung in und aus dem internen Unicode-Namen von einer Reihe von Faktoren abhängt, einschließlich der aktuellen Codepage , und Sie haben ein Rezept für Verwirrung.

Eine gute Beschreibung der Regeln für Windows finden Sie unter MSDN.Die Regeln sind viel komplizierter, als ich hier zusammengefasst habe.

Bearbeiten: ich habe mich verändert \\.\ Zu \\?\ Im obigen Dankeschön an den Kommentar von KitsuneYMG.

Windows-Pfade und Namespaces sind kompliziert.Manche könnten sogar argumentieren, dass sie zu kompliziert sind.Eine Ursache für die Komplexität besteht darin, dass die Win32-API (und jetzt Win64-API) ein Subsystem ist, das auf dem nativen Windows NT-System aufbaut.

Ein Pfad ohne Präfix ist mit den meisten Windows-Plattformen kompatibel.Wenn es auf 7-Bit-ASCII-Zeichen beschränkt ist, ist es mit 16-Bit-DOS seit Version 2.0 oder so kompatibel (wann immer Unterverzeichnisse eingeführt wurden, die möglicherweise tatsächlich in DOS 3 vorhanden waren;aber DOS 1.0 hatte nur Root-Verzeichnisse und das \ (das Zeichen hatte keine besondere Bedeutung).

Der \\?\ Das Präfix bewirkt, dass der Rest des Pfadnamens wörtlich an den entsprechenden Dateisystemtreiber weitergegeben wird, wodurch die Einschränkung aufgehoben wird MAX_PATH Figuren.Wenn sich der lange Pfadname auch auf einer Netzwerkfreigabe befindet, können Sie dafür einen erweiterten UNC-Namen mit dem Präfix verwenden \\?\UNC\server\share\ anstelle des normalen UNC-Namens \\server\share\.Die Verwendung dieses Präfixes schränkt die Portabilität auf Win32 und spätere Windows-Plattformen ein, aber sofern Sie keine Unterstützung für 16-Bit-Windows auf älterer Hardware benötigen, ist das kein großes Problem.

Der \\.\ Präfix ist ein anderes Tier.Es ermöglicht den Zugriff auf Geräteobjekte, die über den Satz speziell benannter Geräte hinausgehen, die von Windows automatisch als spezielle Dateinamen jedem Dateiordner zugeordnet werden.Zu diesen speziellen Namen gehören CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 und LPT9.Beachten Sie, dass alle diese Namen etwas Besonderes sind, unabhängig davon, ob eine Erweiterung oder eine Kombination aus Groß- und Kleinschreibung verwendet wird.Es ist jedoch möglich, dass Sie 10 oder mehr COM-Ports installiert haben.Dies passiert schnell, wenn Sie mit USB-Modems oder USB-Seriell-Port-Adaptern spielen, da jedem einzelnen USB-basierten seriellen Port ein eindeutiger COMn-Name zugewiesen wird.Wenn Sie auf den 50. seriellen Port zugreifen müssen, ist dies nur über den Namen möglich \\.\COM50 weil COM50 ist nicht ein spezieller Name wie COM1 ist.

Die oben zitierte MSDN-Seite hatte das Unterscheidungsrecht, ich habe in meiner ursprünglichen Antwort einfach das falsche Präfix eingegeben.

Sie können pathconf() verwenden zur Laufzeit, um herauszufinden, aber es gibt auch eine PATH_MAX Präprozessor in <limits.h> definieren.

Sie können die realpath Funktion verwenden, um einen Puffer groß genug für einen bestimmten Pfad zu vergeben. Wenn Sie es einen Null-Zeiger als 2. Argument übergeben wird es einen Puffer groß genug für den Pfad zuordnen. Der Mann Seite erklärt wahrscheinlich besser als ich es kann:

  

realpath () erweitert alle symbolischen Links und löst Verweise auf /./, /../ und extra ‚/‘ Zeichen in der nullterminierten String durch Pfad benannt einen kanonisch absoluten Pfadnamen zu erzeugen. Die sich ergebende Pfadname wird als eine Null-terminierte Zeichenkette gespeichert, bis zu einem Maximum von PATH_MAX Bytes im Puffer durch resolved_path spitz. Der resultierende Pfad wird keine symbolische Verbindung hat, /./ oder /../ Komponenten.

     

Wenn resolved_path als NULL angegeben ist, dann realpath () verwendet malloc (3) einen Puffer von zuzuteilen bis PATH_MAX Bytes den Pfad aufgelöst zu halten, und gibt einen Zeiger auf diesen Puffer. Der Anrufer soll diesen Puffer mit freien ausplanen (3).

http://linux.die.net/man/3/realpath

limits.h

/*
 * File system limits
 *
 * NOTE: Apparently the actual size of PATH_MAX is 260, but a space is
 *       required for the NUL. TODO: Test?
 * NOTE: PATH_MAX is the POSIX equivalent for Microsoft's MAX_PATH; the two
 *       are semantically identical, with a limit of 259 characters for the
 *       path name, plus one for a terminating NUL, for a total of 260.
 */
#define PATH_MAX    260

minwindef.h

#define MAX_PATH 260
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top