PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : temporärer Dateiname im Verzeichnis einer bestimmten Datei?



nobody0
20-01-2005, 23:28
Ich brauche in dem Verzeichnis einer bestimmten Datei (z. B. /mnt/sda1/0815/4711.txt) einen temporären Dateinamen um dort eine neue Datei anzulegen.
Welche C-Funktionen gibt es dafür? :confused:

Ich dachte schon daran einen langen Namen aus hexadezimal dargestellter Zeit + Datum + Zufallszahl, aber ich will das Rad nicht neu erfinden und außerdem fehlt mir noch das Verzeichnis, das ja aus dem Datei-Namen extrahiert werden muß.

wraith
21-01-2005, 08:18
man tmpnam (http://www.mcsr.olemiss.edu/cgi-bin/man-cgi?tmpnam+3) tmpnam ist Standard, reicht für dich aber nicht.
tempnam macht hingegen das was du brauchst.

Und wenn du den Dateinamen wie oben angegeben hast, kannst du daraus auch das Verzeichnis 'extrahieren'.

nobody0
21-01-2005, 17:37
Aha, danke :)
Das Extrahieren mache ich dann mal so, dass ich vom String-Ende das letzte Zeichen durch '\0' ersetze, bis das letzte Zeichen gleich "/" ist.

nobody0
22-01-2005, 10:39
Tja, fertigprogrammiert und dazu meint der gcc nun:

In function `fcmp1':
440: warning: the use of `tempnam' is dangerous, better use `mkstemp'

Dann werde ich mal mkstemp nehmen ...

nobody0
22-01-2005, 10:56
Nun habe ich dadurch aber ein anderes Problem: Wie bekomme ich den Namen der Datei, die mkstemp angelegt hat? :confused:
mkstemp liefert ja nur einen file desktiptor und auch über fstat bekomme ich den Namen nicht heraus :(

nobody0
22-01-2005, 11:04
Hm, nach google müsste es mit fdopen auf den file descriptor gehen; mal sehen ...

nobody0
22-01-2005, 11:27
Argh, das ist es natürlich nicht, denn fdopen gibt einen File-Pointer, aber nicht den File-Namen zurück.
Wie bekomme ich den Datei-Namen aus dem File-Pointer? :confused:

nobody0
22-01-2005, 11:41
Also nach info mkstemp ist die Manpage falsch oder zumindest zu ungenau; der Dateiname steht nach dem Funktionsaufruf im Template!

anda_skoa
23-01-2005, 04:17
Für was brauchst du denn den Dateinamen der temporären Datei?

Bzw warum soll sie im selben Verzeichnis sein, wie eine andere, wäre es nicht besser sie ist dort wo das System und der Benutzer temoräre Dateien erwarten?

Ciao,
_

nobody0
23-01-2005, 07:00
Für was brauchst du denn den Dateinamen der temporären Datei?

Bzw warum soll sie im selben Verzeichnis sein, wie eine andere, wäre es nicht besser sie ist dort wo das System und der Benutzer temoräre Dateien erwarten?
_

Ganz einfach: Ich erweitere das Programm dupmerge, dass Dateien gleichen Inhalts durch hard Links ersetzt. Um dies rückgängig machen zu können ist ein inverse mode nötig, der alle hard Links expandiert. Und für dieses Expandieren brauche ich im selben Verzeichnis eine Temporär-Datei, die den hard link nach dem Kopieren + unlink ersetzt. Damit das auch mit größerem wie Images von double-Layer-DVDs oder blue-ray-DVDs problemlos funktioniert, kommt kein anderes Verzeichnis wie /tmp in Frage, denn das ist meist auf einer anderen Partition, so dass allein das Umbenennen (rename) Stunden dauern kann (bei einem 50 GB Image).

anda_skoa
23-01-2005, 20:39
Also im Grunde erzeugst du nur eine Kopie, die dann den selben Namen wie der Hardlink haben soll, richtig?

Dafür bräuchtest du keine temporäre Datei, du kannst die Kopie ja gleich richtig benennen:

- Quelldatei (hardlink) öffnen
- Quelldatei löschen
- Zieldatei öffnen
- kopieren

Ciao,
_

nobody0
23-01-2005, 21:28
Also im Grunde erzeugst du nur eine Kopie, die dann den selben Namen wie der Hardlink haben soll, richtig?

Dafür bräuchtest du keine temporäre Datei, du kannst die Kopie ja gleich richtig benennen:

- Quelldatei (hardlink) öffnen
- Quelldatei löschen
- Zieldatei öffnen
- kopieren

Ciao,
_

Tja, nach dem "- Quelldatei löschen" ist aber nix mehr da zum kopieren; da hat man sozusagen den Ast abgesegt, auf dem man sitzt.
In meiner ersten Version ging das eingeschränkt mit dem Trick, dass ein gleicher (aber nicht derselbe) hard link mittels qsort genommen wurde, aber wegen dem O(n*log(n)) ist das zu lahm.

Außerdem soll mit der Temporär-Datei fast immer sichergestellt sein, dass bei sowas wie plötzlichem reboot die Original-Datei noch intakt ist.

anda_skoa
24-01-2005, 20:32
Tja, nach dem "- Quelldatei löschen" ist aber nix mehr da zum kopieren; da hat man sozusagen den Ast abgesegt, auf dem man sitzt.

Ich hab angenommen das es hier um ein Unix Programm geht, unter Windows passiert das natürlich (obwohl ich glaube mich zu erinnern, dass in diesem Fall Windows das Löschen blockiert)

Ciao,
_

nobody0
24-01-2005, 20:43
Das ist unter Linux.
Ok, nach der man-page könnte man wohl auf die Datei nach einem unlink noch zugreifen und mit einem Namen auskommen, aber wie geschrieben wäre das wenig stör-tolerant. Und vor dem unlink müsste man die Datei öffnen; nachher wäre zu spät; d. h. statt "Datei löschen" bräuchte man "geöffnete Datei unlinken".

anda_skoa
25-01-2005, 05:46
Und vor dem unlink müsste man die Datei öffnen

Natürlich, das ist aber eben eine übliche Vorgehensweise:
Alle Prozesse, die eine Datei offen haben, behalten diese natürlich auch, es wird ja nur der Name aus dem Dateisystem entfernt, nicht die Datei ansich gelöscht.

Dadurch kann eine neue Datei mit dem vorher benutzen Namen angelegt werden.

Ciao,
_