Implementieren Sie die Funktion realpath() in C++

Jay Shaw 12 Oktober 2023
  1. Implementieren Sie die Funktion realpath() in C++
  2. Finden Sie den absoluten Pfad mit der Funktion realpath() in C++
  3. Verwenden Sie einen einzeiligen Befehl, um den absoluten Pfad mit der Funktion realpath() in C++ zu finden
  4. Abschluss
Implementieren Sie die Funktion realpath() in C++

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 \).

  1. Öffnen Sie den Texteditor in einer beliebigen Linux-Distribution mit der Erweiterung .cpp.

  2. Das Programm hat fünf Importdateien: limits.h zur Aufnahme der Unterfunktion PATH_MAX, stdio für Input-Output-Funktionen, stdlib, string für String-Funktionen, cerrno für Fehlerfälle .

  3. Innerhalb der main-Funktion wird eine Variable erstellt – ein Char-Array buffer[] mit einer als PATH_MAX eingestellten Größe. Die Verwendung von PATH_MAX ist eine bessere Vorgehensweise zum Speichern von Pfadnamen, anstatt nur zu raten.

  4. 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);
    
  5. Wenn ein aufgelöster Name erfolgreich von der Funktion realpath() in C++ zurückgegeben wird, wird der Wert in der Variablen buffer gedruckt.

    if (path) {
      printf("Absolute Path = %s.\n", buffer);
    }
    
  6. Liefert die Funktion realpath() einen Null-Zeiger zurück, setzt das Programm mit der Funktion errno ein Fehler-Flag.

    char* errStr = strerror(errno);
    

    Die Funktion errno ist eine Member-Funktion der Bibliothek cerrno. Es gibt einen numerischen Fehlercode zurück, der jedoch mit der Funktion strerror in den entsprechenden Stringwert umgewandelt wird: char* errStr = strerror(errno).

  7. Der perror gibt eine Fehlermeldung an stder aus. Die Funktion gibt zuerst den in geschweiften Klammern bereitgestellten Text aus, gefolgt von der Fehlermeldung.

    perror("realpath");
    
  8. Schließlich wird das Programm mit dem Beendigungscode EXIT_FAILURE innerhalb des else-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:

  1. Das gcc -o realpath erstellt eine Ausgabeanwendung realpath mit dem gcc-Compiler.
  2. Der Code hat zwei Bibliothekspakete: stdlib und stdio.
  3. Innerhalb der Methode main werden zwei Variablen erstellt: eine Integer-Variable c und ein Zeiger v.
  4. puts(realpath(v[1],0)) gibt das String-Literal zurück, das von der Funktion realpath() 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.