Ich steh grad voll aufm Schlauch und suche gerade wie bekloppt nach der C-Funktion, mit der man einen Dateizeiger setzen kann ohne die Datei zu öffnen. Mit fseek muss man die Datei öffnen. Im Quelltext von Klaus war sie auch irgendwo mal genutzt worden, weiß aber nicht mehr wo. Ich hab auch meine C-Referenzen grad nicht zur Hand.
fseek ohne Dateiöffnen
- methodus
- Geschlossen
-
-
Wie soll das gehen? Der Schreiblesezeiger gehört ja zum Handle der geöffneten Datei. Deshalb kann z.B. ein Prozess eine Datei schreiben (Schreibzeiger) und mehrere andere Prozesse sie lesen (mit unterschiedlichen Lesezeigern). Wenn die Datei geschlossen wird ist auch der Zeiger "futsch".
Ich denke, Du meinst vermutlich etwas anderes und verwechselst das mit Dateizeigern. Kann das sein? -
Okay, war in der Tat nen Fehler. Es fiel nicht das Dateiöffnen weg, sondern das ermitteln der Position mit ftell. Die Funktion hieß lseek. Die ermittelt die Position sofort ohne ftell nochmal anwenden zu müssen.
Jetzt bin ich mir aber nicht sicher, was besser ist. fseek mit ftell oder lseek. Ich will im Prinzip nur feststellen, was der letzte Fileoffset einer Datei ist. Ginge das vielleicht auch eleganter? Eventuell über die Dateigröße?
-
Über die Dateigröße müsste sich was machen lassen - solange es keine Sparse-Files sind
-
und wie?
-
mit dem stat-Befehl, der liefert ein struct zurück, in dem auch die Größe vorhanden ist:
Codestruct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ ..... off_t st_size; /* total size, in bytes */ ..... };
siehe auch "man 2 stat" -
Das ist die Dateigröße auf der Festplatte. Stimmt die auch mit der richtigen Größe überein? Es wäre fatal (weil segfaults vorprogrammiert), wenn diese Größe die Blockgröße der Datei ist. Die kann ja sehr schwanken.
-
Da steht ja "total size, in bytes"
Schau dir mal die man-page an, in dem struct gibts auch noch die Blockgröße etc. Beispiele für stat gibts in skinElchi und im VDR -
okay, dann nehm ich det.. müsste theoretisch performanter sein.
-
Zitat
Original von methodus
Okay, war in der Tat nen Fehler. Es fiel nicht das Dateiöffnen weg, sondern das ermitteln der Position mit ftell. Die Funktion hieß lseek. Die ermittelt die Position sofort ohne ftell nochmal anwenden zu müssen.Jetzt bin ich mir aber nicht sicher, was besser ist. fseek mit ftell oder lseek. Ich will im Prinzip nur feststellen, was der letzte Fileoffset einer Datei ist. Ginge das vielleicht auch eleganter? Eventuell über die Dateigröße?
off_t fileSize = lseek(stream, 0, SEEK_END);setzt den Dateizeiger an das Ende und gibt den Offset zurück.
ardi
PS: fileSize == -1 --> ERROR
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!