Implementieren Sie die Funktion realpath() in C++
-
Implementieren Sie die Funktion
realpath()
in C++ -
Finden Sie den absoluten Pfad mit der Funktion
realpath()
in C++ -
Verwenden Sie einen einzeiligen Befehl, um den absoluten Pfad mit der Funktion
realpath()
in C++ zu finden - Abschluss
Die Funktion realpath()
wurde erstmals in POSIX 1997 und POSIX 2008 als Funktion dokumentiert, um den absoluten Pfad einer Datei innerhalb eines Verzeichnisses zu finden.
Dieser Artikel erklärt die Implementierung der Funktion realpath()
in C++. Es kann in das System implementiert werden, um den absoluten Pfad einer Datei mit C++ zu finden.
Implementieren Sie die Funktion realpath()
in C++
Die Hauptverwendung von realpath()
in C++ besteht darin, den Pfadnamen einer Datei zu finden, wenn alle ihre symbolischen Links aufgelöst sind.
Bevor wir auf die Implementierung von realpath()
in C++ eingehen, hier einige grundlegende Konzepte, die bekannt sein müssen:
- Symbolischer Link: Ein symbolischer Link verweist auf seine Zieldatei, unterscheidet sich jedoch von einer Verknüpfung, da der Computer den symbolischen Link als eigenständige Datei und nicht als Link zur Zieldatei behandelt. Es fungiert als eine Art Datei, die den Benutzer beim Zugriff an den Ort führt, an dem die Originaldatei vorhanden ist, und alle Änderungen, die an der symbolischen Verknüpfung vorgenommen werden, spiegeln sich auch in der Originaldatei wider.
- Absoluter Pfad: Wenn der Pfad zu einer Datei bis zu ihrem Stammverzeichnis geschrieben wird, wie
\usr\bin\main
, wird er als absoluter Pfad bezeichnet. - Relativer Pfad: Wenn das aktuelle Arbeitsverzeichnis auf
usr\bin
eingestellt ist, dann kann die Datei, deren absoluter Pfad/usr/bin/main
ist, einfach als main referenziert werden. Beispielsweise erreichen der UNIX-Befehl:cp /usr/bin/main /usr/bin/main.bak
und der Befehl:cp mailbox mailbox.bak
dasselbe, wenn das Arbeitsverzeichnis/usr/ast
ist.
Der von der Funktion realpath()
in C++ gefundene Pfadname ist nicht unbedingt absolut, wenn der gelieferte Wert ein relativer Name ist, aber das hängt auch davon ab, ob ein symbolischer Link mit absoluten Namen für den Linkwert durchlaufen wird. Wenn dies der Fall ist, ist die Ausgabe ein absoluter Name.
Finden Sie den absoluten Pfad mit der Funktion realpath()
in C++
Lassen Sie uns ein Programm erstellen, das den absoluten Pfad einer Datei mit realpath()
in C++ findet. Dieses Beispiel wird unter Linux demonstriert (unter Windows ist das Trennzeichen \
).
-
Öffnen Sie den Texteditor in einer beliebigen Linux-Distribution mit der Erweiterung
.cpp
. -
Das Programm hat fünf Importdateien:
limits.h
zur Aufnahme der UnterfunktionPATH_MAX
,stdio
für Input-Output-Funktionen,stdlib
,string
für String-Funktionen,cerrno
für Fehlerfälle . -
Innerhalb der
main
-Funktion wird eine Variable erstellt – ein Char-Arraybuffer[]
mit einer alsPATH_MAX
eingestellten Größe. Die Verwendung vonPATH_MAX
ist eine bessere Vorgehensweise zum Speichern von Pfadnamen, anstatt nur zu raten. -
realpath()
in C++ übernimmt zwei Parameter: Dateiname und aufgelöster Name. Es gibt einen Zeiger auf den aufgelösten Namen zurück; andernfalls wird ein Fehler-Flag zurückgegeben.char *path = realpath("test.py", buffer);
-
Wenn ein aufgelöster Name erfolgreich von der Funktion
realpath()
in C++ zurückgegeben wird, wird der Wert in der Variablenbuffer
gedruckt.if (path) { printf("Absolute Path = %s.\n", buffer); }
-
Liefert die Funktion
realpath()
einen Null-Zeiger zurück, setzt das Programm mit der Funktionerrno
ein Fehler-Flag.char* errStr = strerror(errno);
Die Funktion
errno
ist eine Member-Funktion der Bibliothekcerrno
. Es gibt einen numerischen Fehlercode zurück, der jedoch mit der Funktionstrerror
in den entsprechenden Stringwert umgewandelt wird:char* errStr = strerror(errno)
. -
Der
perror
gibt eine Fehlermeldung anstder
aus. Die Funktion gibt zuerst den in geschweiften Klammern bereitgestellten Text aus, gefolgt von der Fehlermeldung.perror("realpath");
-
Schließlich wird das Programm mit dem Beendigungscode
EXIT_FAILURE
innerhalb deselse
-Blocks beendet.exit(EXIT_FAILURE);
Code:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cerrno>
int main(void) {
char buffer[PATH_MAX];
char* path = realpath("test.py", buffer);
if (path) { // or: if (path != NULL)
printf("Absolute Path = %s.\n", buffer);
} else {
char* errStr = strerror(errno);
printf("String Error: %s\n", errStr);
perror("realpath");
exit(EXIT_FAILURE);
}
return 0;
}
Zusammenstellung:
Da der Code in Linux geschrieben ist, muss er mit dem Terminal kompiliert werden. Speichern Sie die Textdatei, in der der Code geschrieben ist, unter einem geeigneten Namen (z. B.: C-realpath
) und mit der Erweiterung .cpp
.
Die Datei wird mit dem gcc
-Compiler kompiliert und eine neue Anwendung wird erstellt, um den Code auszuführen.
Verwenden Sie die folgende Syntax:
gcc -o realpath2 C-realpath.cpp
Die obige Syntax kompiliert den Code erfolgreich, sofern keine Fehler vorliegen. Nach dem Kompilieren erstellt der Compiler eine Ausgabeanwendung – realpath2
für unseren Code.
Geben Sie zum Ausführen der Anwendung die folgende Syntax ein:
./realpath2
Ausgang:
jay@jay-virtual-machine:~$ gcc -o realpath2 C-realpath.cpp
jay@jay-virtual-machine:~$ ./realpath2
Absolute Path = /home/jay/test.py.
Da die Datei test.py
im System existiert, gibt das Programm ihren absoluten Pfad aus.
Falls für die Datei ein falscher Name angegeben wird oder die Datei fehlt, gibt die Anwendung den Fehlercode aus:
jay@jay-virtual-machine:~$ ./realpath2
String Error: No such file or directory
realpath: No such file or directory
Verwenden Sie einen einzeiligen Befehl, um den absoluten Pfad mit der Funktion realpath()
in C++ zu finden
Die Funktion realpath()
in C++ kann auch durch einzeilige Befehle in Linux implementiert werden. Dies erspart dem Programmierer das Erstellen von Textdateien zum Schreiben von Code und das separate Kompilieren.
Um den Code zu kompilieren, schreiben Sie die folgende Syntax in das Terminal:
gcc -o realpath -x c - <<< $'#include<stdlib.h>\n#include<stdio.h>\nint main(int c,char**v){puts(realpath(v[1],0));}'
Was der Code macht:
- Das
gcc -o realpath
erstellt eine Ausgabeanwendungrealpath
mit demgcc
-Compiler. - Der Code hat zwei Bibliothekspakete:
stdlib
undstdio
. - Innerhalb der Methode
main
werden zwei Variablen erstellt: eine Integer-Variablec
und ein Zeigerv
. puts(realpath(v[1],0))
gibt das String-Literal zurück, das von der Funktionrealpath()
zurückgegeben wird.
Der Ausgabeanwendung realpath
muss ein Dateiname oder Pfad zur Verfügung gestellt werden, um eine Ausgabe zu generieren. In diesem Beispiel wird ein Ordner innerhalb des Dateisystems an die Anwendung übergeben und gibt den absoluten Pfad der Datei zurück.
Ausgang:
jay@jay-virtual-machine:~$ ./realpath snap
/home/jay/snap
Da es im Code keine Fehlerausnahme gibt, werden Fehler ausgegeben, falls die Eingabe eine fehlende Datei ist:
jay@jay-virtual-machine:~$ ./realpath vid
Segmentation fault (core dumped)
Abschluss
Dieser Artikel erklärt, wie man die Funktion realpath()
in C++ implementiert, um den absoluten Pfad einer Datei zu finden. Nach dem Durcharbeiten des Artikels kann der Leser den absoluten Pfad für Dateien mit realpath()
in C++ ableiten.