Dateigröße in C ermitteln
-
Verwenden Sie die Funktion
stat
, um die Dateigröße in C zu ermitteln -
Verwenden der Funktion
fstat
zum Ermitteln der Dateigröße in C
Dieser Artikel erklärt verschiedene Methoden, wie man die Dateigröße in C ermitteln kann.
Verwenden Sie die Funktion stat
, um die Dateigröße in C zu ermitteln
Der Systemaufruf stat
ist eine POSIX-konforme Funktion, die verwendet werden kann, um verschiedene Attribute der angegebenen Datei abzurufen. Sie nimmt zwei Argumente entgegen - das erste ist der char
-Zeiger, der auf den Pfadnamen der Datei zeigen sollte, und das zweite Argument ist vom Typ struct stat
-Zeiger, der in der Funktion manual ausführlich beschrieben ist. Sobald der Funktionsaufruf erfolgreich zurückkehrt, kann der Anwender die benötigten Attribute der Datei aus dem struct stat
extrahieren, indem er direkt auf dessen Mitglieder zugreift. Die Dateigröße wird im Member st_size
der Struktur gespeichert. Beachten Sie, dass die Funktion stat
keine Rechte auf die Datei benötigt, um die Attribute abzurufen, aber der Aufrufer sollte Ausführungsrechte auf jedes im Pfadnamen enthaltene Verzeichnis haben.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
struct stat sb;
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
printf("Inode number: %lu\n", sb.st_ino);
printf("User ID of owner: %u\n", sb.st_uid);
printf("Group ID of owner: %u\n", sb.st_gid);
printf("Total file size: %lu bytes\n", sb.st_size);
printf("Last status change: %s", ctime(&sb.st_ctime));
printf("Last file access: %s", ctime(&sb.st_atime));
printf("Last file modification: %s", ctime(&sb.st_mtime));
exit(EXIT_SUCCESS);
}
Ausgabe:
Inode number: 12638061
User ID of owner: 1000
Group ID of owner: 1000
Total file size: 126 bytes
Last status change: Sat Feb 6 23:35:02 2021
Last file access: Sat Feb 6 23:35:02 2021
Last file modification: Sat Feb 6 23:35:02 2021
Das Element st_size
stellt die Gesamtgröße der Datei in Bytes dar. Für den Fall, dass der angegebene Pfadname ein symbolischer Link ist, gibt dieses Mitglied die Länge des Zeigers auf den Pfadnamen durch den Link an. Wir implementieren ein Beispiel, das den Dateinamen aus dem als const
deklarierten hartkodierten String-Wert im obigen Code-Beispiel übernimmt, obwohl der Benutzer den Dateinamen als Programmparameter übergeben kann, wie im folgenden Beispiel gezeigt wird. Der Aufruf von stat
gibt im Fehlerfall -1
zurück und errno
wird entsprechend gesetzt; andernfalls wird Null zurückgegeben, um den Erfolg zu kennzeichnen.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
int main(int argc, char *argv[]) {
struct stat sb;
char *filename = NULL;
if (argc != 2) {
printf("Usage: ./program filename\n");
exit(EXIT_FAILURE);
}
filename = argv[1];
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
printf("Inode number: %lu\n", sb.st_ino);
printf("User ID of owner: %u\n", sb.st_uid);
printf("Group ID of owner: %u\n", sb.st_gid);
printf("Total file size: %lu bytes\n", sb.st_size);
printf("Last status change: %s", ctime(&sb.st_ctime));
printf("Last file access: %s", ctime(&sb.st_atime));
printf("Last file modification: %s", ctime(&sb.st_mtime));
exit(EXIT_SUCCESS);
}
Verwenden der Funktion fstat
zum Ermitteln der Dateigröße in C
Alternativ können wir die Funktion fstat
verwenden, die den Dateideskriptor als erstes Argument nimmt, um die Zieldatei anzugeben. Der Dateideskriptor kann mit dem Systemaufruf open
erfasst werden, aber stellen Sie sicher, dass Sie geöffnete Dateien mit dem Systemaufruf close
schließen, wenn sie nicht benötigt werden. Beachten Sie, dass alle Beispiele in diesem Artikel die meisten der struct stat
-Mitglieder ausgeben. Möglicherweise müssen Sie die relevanten Informationen über die Attribute mithilfe der zusätzlichen Funktionen extrahieren, z. B. st_mode
und st_dev
.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
struct stat sb;
int fd = open(filename, O_RDONLY);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
if (fstat(fd, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
printf("Inode number: %lu\n", sb.st_ino);
printf("User ID of owner: %u\n", sb.st_uid);
printf("Group ID of owner: %u\n", sb.st_gid);
printf("Total file size: %lu bytes\n", sb.st_size);
printf("Last status change: %s", ctime(&sb.st_ctime));
printf("Last file access: %s", ctime(&sb.st_atime));
printf("Last file modification: %s", ctime(&sb.st_mtime));
close(fd);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook