Dateigröße in C ermitteln

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion stat, um die Dateigröße in C zu ermitteln
  2. Verwenden der Funktion fstat zum Ermitteln der Dateigröße in C
Dateigröße in C ermitteln

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);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C File