Unix path resolution
-
Hi
ich bin zu einem Problem gestossen, was ich ohne weiteres lösen kann.
Wenn ich folgenden Code habe:
#include <stdio.h> int main(int argc, char **argv) { FILE *f; f = fopen("~/test.mp3", "r"); if(f == NULL) perror("fopen"); else fclose(f); return 0; }
und die Datei ~/test.mp3 tatsächlich existiert, bekomme ich (wie erwartet) fopen: No such file or directory.
Gibt es eine Funktion, die Pfade in der Form ~/xxx automatisch auf <current user home>/xxx auflöst? Oder muss ich das selber parsen, was ich nicht will, weil ich nicht alle solche Abkürzungen kenne. Wie kann ich das am besten lösen?
Gruss
Pablo
-
was meinst du mit "alle solche abkürzungen"?
soweit ich weiß, gibt es keine funktion, die dir nur das macht. glob und wordexp machen mehr. wenn du es selbst machen willst, kannst du einfach prüfen, ob das erste zeichen einer pfadangabe die tilde ist. wenn du sowieso für die pfadangabe auch einen regulären ausdruck unterstützen willst (zb. ~/*.mp3), kannst du glob verwenden, wobei nur das glob der glibc die tilde als extension unterstützt. ob das andere libcs auch tun, weiß ich nicht.
-
namenlos schrieb:
was meinst du mit "alle solche abkürzungen"?
damit meine sowas wie ~/xxx oder ~user/yyy.
namenlos schrieb:
wenn du sowieso für die pfadangabe auch einen regulären ausdruck unterstützen willst (zb. ~/*.mp3), kannst du glob verwenden, wobei nur das glob der glibc die tilde als extension unterstützt. ob das andere libcs auch tun, weiß ich nicht.
Interessant, bin über die glob manpage auf man: wordexp(3) gestossen, sieht gut aus. Eigentlich will ich aus einer config Datei eine Liste von Verzeichnissen lesen in der Form
plugin_dirs=~/my_dir_1:~/my_dir_2:/usr/libexec/was_auch_immer
d.h. sowas wie ~/*.mp3 wird eher nicht vorkommen. Aber ich glaub, du hast mir schon weit geholfen. Danke
Gruss
Pablo
-
So, habe jetzt viel zu lange hiernach gesucht, nur um jetzt festzustellen, dass Du vielleicht gar nichts damit anfangen kannst:
man: realpath(3)
-
switch(path[0]) { case '~': snprintf(complete_path,sizeof(complete_path),"%s/%s",getenv("HOME"),path + 2); case '/': ... break; default: ... break; }
Mehr "Problemzeichen" als die Tilde gibt es nicht.
MfG
-
bdfs: Das funktioniert mit ~username nicht.
-
realpath war auch meine erste idee, aber das kann nur relative pfadangaben und symbolische links auflösen.
es sollte aber nicht all zu schwer sein, eine eigene funktion für die tilde zu schreiben.
-
@nman: danke trotzdem.
Aber der Tipp mit glob war gut, denn dann bin ich auf wordexp gekommen und das ist genau, was ich brauche.
es sollte aber nicht all zu schwer sein, eine eigene funktion für die tilde zu schreiben.
eigentlich nicht, wenn ich es mir recht überlege. Woaruf muss denn man alles beachten? ~/xxx und ~user/xxx. Mir fallen keine weitere ein, also wären nur 2 Fällen. Eine Tilde in der Mitte wird nicht als $HOME aufgelöst.