web-dev-qa-db-de.com

Absoluten Pfad einer Datei abrufen

Wie kann ich in C unter Unix einen relativen Pfad in einen absoluten Pfad konvertieren? Gibt es dafür eine praktische Systemfunktion?

Unter Windows gibt es eine GetFullPathName-Funktion, die den Job erledigt, aber unter Unix habe ich nichts Ähnliches gefunden ...

35
evgenka

Verwenden Sie realpath () .

Die realpath()-Funktion soll abgeleitet werden aus dem Pfadnamen, auf den mit .__ hingewiesen wurde. file_name, ein absoluter Pfadname, der benennt die gleiche Datei, deren Auflösung beinhaltet nicht '.', '..' oder symbolische Links. Der generierte Pfadname werden als nullterminiert gespeichert Zeichenfolge bis maximal {PATH_MAX} Bytes in dem Puffer, auf den resolved_name.

Wenn resolved_name ein Nullzeiger ist, das Verhalten von realpath() ist Implementierung definiert.


Das folgende Beispiel generiert eine absoluter Pfadname für die Datei identifiziert durch den symlinkpath Streit. Der generierte Pfadname lautet im tatsächlichen Pfad-Array gespeichert.

#include <stdlib.h>
...
char *symlinkpath = "/tmp/symlink/file";
char actualpath [PATH_MAX+1];
char *ptr;


ptr = realpath(symlinkpath, actualpath);
44
xsl

Versuchen Sie auch "getcwd"

#include <unistd.h>

char cwd[100000];
getcwd(cwd, sizeof(cwd));
std::cout << "Absolute path: "<< cwd << "/" << __FILE__ << std::endl;

Ergebnis:

Absolute path: /media/setivolkylany/WorkDisk/Programming/Sources/MichailFlenov/main.cpp

Testumgebung:

[email protected]$/ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.6 (jessie)
Release:    8.6
Codename:   jessie
[email protected]$/ uname -a
Linux localhost 3.16.0-4-AMD64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
[email protected]$/ g++ --version
g++ (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1
Seti Volkylany

Versuchen Sie realpath() in stdlib.h

char filename[] = "../../../../data/000000.jpg";
char* path = realpath(filename, NULL);
if(path == NULL){
    printf("cannot find file with name[%s]\n", filename);
} else{
    printf("path[%s]\n", path);
    free(path);
}
0
Scott Yang

Es gibt auch eine kleine Pfadbibliothek cwalk , die plattformübergreifend funktioniert. Es hat cwk_path_get_absolute um das zu tun:

#include <cwalk.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  char buffer[FILENAME_MAX];

  cwk_path_get_absolute("/hello/there", "./world", buffer, sizeof(buffer));
  printf("The absolute path is: %s", buffer);

  return EXIT_SUCCESS;
}

Ausgänge:

The absolute path is: /hello/there/world
0
Julius