Wie kann ich die Größe einer Datei in Byte ermitteln?
#include <stdio.h>
unsigned int fsize(char* file){
//what goes here?
}
Lösung des Problems
Auf Unix-ähnlichen Systemen können Sie POSIX-Systemaufrufe verwenden: stat
auf einem Pfad oder fstat
auf einem bereits geöffneten Dateideskriptor (POSIX- Manpage, Linux - Manpage ).
(Holen Sie sich einen Dateideskriptor von open(2)
, oder fileno(FILE*)
in einem Stdio-Stream).
Basierend auf dem Code von NilObject:
#include <sys/stat.h>
#include <sys/types.h>
off_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
Änderungen:
- Das Dateinamen-Argument wurde zu einem
const char
. - Korrigierte die
struct stat
Definition, bei der der Variablenname fehlte. - Gibt
-1
bei einem Fehler anstelle von zurück0
, was für eine leere Datei mehrdeutig wäre.off_t
ist ein signierter Typ, daher ist dies möglich.
Wenn Sie fsize()
bei einem Fehler eine Nachricht drucken möchten, können Sie Folgendes verwenden:
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
off_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
fprintf(stderr, "Cannot determine size of %s: %s\n",
filename, strerror(errno));
return -1;
}
Auf 32-Bit-Systemen sollten Sie dies mit der Option kompilieren -D_FILE_OFFSET_BITS=64
, da sonst off_t
nur Werte bis 2 GB enthalten sind. Weitere Informationen finden Sie im Abschnitt „Using LFS" von Large File Support in Linux.
Keine Kommentare:
Kommentar veröffentlichen