Gibt es eine Möglichkeit, das übergeordnete Verzeichnis einer Datei mit einem C-Programm herauszufinden? Ich möchte der Datei die gleichen Berechtigungen geben, die das Verzeichnis hat. Um dies zu tun, möchte ich das übergeordnete Verzeichnis der Datei kennen. Für jede Hilfe bin ich dankbar.
Antworten
Zu viele Anzeigen?Wenn Sie den Pfad der Datei haben, können Sie ihn manuell ändern, indem Sie einen absoluten Pfad angeben, wenn er relativ ist (nicht mit einem /
unter Unix, oder ein letter:\
o \
o letter:/
o /
unter Windows) und dann an Dateitrennzeichen aufteilen ( /
o \
), aber mir ist keine eingebaute Funktion bekannt, die all dies für Sie erledigt.
T basename
y dirname
Funktionen können helfen, aber Sie müssen selbst genug über den Pfad der Datei herausfinden, da sie nur mit Zeichenketten arbeiten; sie fragen das Dateisystem nicht ab.
Es ist nicht garantiert, dass es Die richtige Sache aber haben Sie eine der folgenden Möglichkeiten ausprobiert?
-
Wenn Ihr Dateiname ein Pfad-Trennzeichen enthält (z. B.
/
unter Unix,\
unter Windows), kopieren Sie die Zeichenfolge z. B. mitstrdup()
und ersetzen Sie das letzte Vorkommen des Pfadseparators (z. B. mitstrrchr()
) mit einem Null-/Nullzeichen. Die resultierende Zeichenkette ist das übergeordnete Verzeichnis Ihrer Datei. -
Wenn kein Pfadseparator vorhanden ist, befindet sich die Datei in Ihrem aktuellen Arbeitsverzeichnis. Haben Sie versucht, einfach mit
.
? Die.
y..
Links funktionieren sowohl unter Unix als auch unter Windows.
Es gibt eine ganze Reihe von Eckfällen (z.B. die Frage, was mit der Datei /hello.txt
?), aber es sollte ein Anfang sein.
Eine solche Funktion gibt es in Standard C nicht. Sie können Ihr Glück unter Windows mit GetFullPathName
und dann vielleicht _splitpath
Aber so wie es geschrieben ist, gibt es keine Standardfunktion, um solche Dinge zu tun.
Ich habe ein C-Sprachfragment mit Codes aus cplusplus-Webseite , Goz's Antwort y thkala's Antwort .
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
.
.
.
out_file_name = "c:/Users/Documents/output/test.txt";
const char ch = '/';
char* rest;
int loc;
char letter;
char* pointer_to_loc;
// Current directory
rest = strrchr(out_file_name, ch);
// Just make sure there is a directory
if (rest != NULL) {
pointer_to_loc = strrchr(out_file_name, ch); # Pointer to last / symbol
loc = rest - out_file_name + 1;
char subbuff[loc]; # string for truncated string
loc--;
memcpy( subbuff, &out_file_name[0], loc ); # copy section of string
subbuff[loc] = '\0';
// Parent directory, now input is current directory from previous section
rest = strrchr(subbuff, ch);
if (rest != NULL) {
loc = rest - subbuff + 1;
char subsubbuff[loc];
loc--;
memcpy( subsubbuff, &subbuff[0], loc );
subsubbuff[loc] = '\0';
printf (subsubbuff); // Parent directory
printf ("\n");
}
printf (subbuff); // Current directory
printf ("\n");
}
printf (output_file_name); // Entire path to file
1 Stimmen
Von String? Aus Dateideskriptor?
2 Stimmen
Eine Datei kann mehr als 1 übergeordnetes Verzeichnis haben: siehe
man ln
unter Linux, Verbindungspunkt oder was auch immer unter Windows (mklink /?
funktioniert auf meinem Windows Vista)0 Stimmen
Wenn Sie ihm keine Rechte geben, erbt es die Rechte des Verzeichnisses.
0 Stimmen
Ich möchte nicht die gesamte Hierarchie kennen, sondern nur die unterste.
0 Stimmen
@pmg ja, wir haben Glück, wir haben jetzt echte Symlinks auf Windows!!!
0 Stimmen
@David Ich will keinen Streit anfangen, aber Sie können nicht
cd
in ein Abzweigungsverzeichnis, also würde ich nicht sagen, dass sie echt sind :-P0 Stimmen
Welches Betriebssystem und Dateisystem verwenden Sie? Standard C bietet nicht das, was Sie wollen.
0 Stimmen
@Jonathan Das sind Kreuzungen. Sie sind nicht auf dem Laufenden. Wir haben jetzt Symlinks in Windows 7. Und man kann in ein Junction-Verzeichnis als make by
junction
. Sie hat es einfach getan.0 Stimmen
@David Neat! Das letzte Mal, als ich es versuchte, sagte es mir, dass es nicht geht, aber das war vor etwa einem Jahr unter Vista.
0 Stimmen
@Jonathan Das habe ich noch nie gesehen, das geht auf win2k zurück, aber wer weiß das schon bei Kreuzungen. Sie sind ein bisschen seltsam.