466 Stimmen

Wie kann ich die Größe einer Datei in C ermitteln?

Wie kann ich die Größe einer Datei herausfinden, die ich mit einer in C geschriebenen Anwendung geöffnet habe? Ich möchte die Größe wissen, weil ich den Inhalt der geladenen Datei in einen String schreiben möchte, den ich mit malloc() . Einfach schreiben malloc(10000*sizeof(char)); ist IMHO eine schlechte Idee.

634voto

Rob Walker Punkte 45267

Sie müssen bis zum Ende der Datei suchen und dann nach der Position fragen:

fseek(fp, 0L, SEEK_END);
sz = ftell(fp);

Sie können dann z. B. zurücksuchen:

fseek(fp, 0L, SEEK_SET);

oder (wenn Sie zum Anfang zurückkehren möchten)

rewind(fp);

455voto

Greg Hewgill Punkte 882617

Verwendung der Standardbibliothek:

Vorausgesetzt, dass Ihre Implementierung SEEK_END sinnvoll unterstützt:

fseek(f, 0, SEEK_END); // seek to end of file
size = ftell(f); // get current file pointer
fseek(f, 0, SEEK_SET); // seek back to beginning of file
// proceed with allocating memory and reading the file

Linux/POSIX:

Sie können verwenden stat (wenn Sie den Dateinamen kennen), oder fstat (wenn Sie den Dateideskriptor haben).

Hier ist ein Beispiel für die Statistik:

#include <sys/stat.h>
struct stat st;
stat(filename, &st);
size = st.st_size;

Win32:

Sie können verwenden GetFileSize o GetFileSizeEx .

130voto

PiedPiper Punkte 5557

Wenn Sie den Dateideskriptor fstat() gibt eine stat-Struktur zurück, die die Dateigröße enthält.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

// fd = fileno(f); //if you have a stream (e.g. from fopen), not a file descriptor.
struct stat buf;
fstat(fd, &buf);
off_t size = buf.st_size;

27voto

Earlz Punkte 59611

Am Ende habe ich nur eine kurze und knappe fsize function(note, keine Fehlerprüfung)

int fsize(FILE *fp){
    int prev=ftell(fp);
    fseek(fp, 0L, SEEK_END);
    int sz=ftell(fp);
    fseek(fp,prev,SEEK_SET); //go back to where we were
    return sz;
}

Es ist irgendwie dumm, dass die Standard-C-Bibliothek nicht über eine solche Funktion verfügt, aber ich kann verstehen, warum es schwierig sein würde, da nicht jede "Datei" eine Größe hat (zum Beispiel /dev/null )

19voto

lezard Punkte 1

Wie zu verwenden lseek / fseek / stat / fstat um die Dateigröße zu erhalten?

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

void
fseek_filesize(const char *filename)
{
    FILE *fp = NULL;
    long off;

    fp = fopen(filename, "r");
    if (fp == NULL)
    {
        printf("failed to fopen %s\n", filename);
        exit(EXIT_FAILURE);
    }

    if (fseek(fp, 0, SEEK_END) == -1)
    {
        printf("failed to fseek %s\n", filename);
        exit(EXIT_FAILURE);
    }

    off = ftell(fp);
    if (off == -1)
    {
        printf("failed to ftell %s\n", filename);
        exit(EXIT_FAILURE);
    }

    printf("[*] fseek_filesize - file: %s, size: %ld\n", filename, off);

    if (fclose(fp) != 0)
    {
        printf("failed to fclose %s\n", filename);
        exit(EXIT_FAILURE);
    }
}

void
fstat_filesize(const char *filename)
{
    int fd;
    struct stat statbuf;

    fd = open(filename, O_RDONLY, S_IRUSR | S_IRGRP);
    if (fd == -1)
    {
        printf("failed to open %s\n", filename);
        exit(EXIT_FAILURE);
    }

    if (fstat(fd, &statbuf) == -1)
    {
        printf("failed to fstat %s\n", filename);
        exit(EXIT_FAILURE);
    }

    printf("[*] fstat_filesize - file: %s, size: %lld\n", filename, statbuf.st_size);

    if (close(fd) == -1)
    {
        printf("failed to fclose %s\n", filename);
        exit(EXIT_FAILURE);
    }
}

void
stat_filesize(const char *filename)
{
    struct stat statbuf;

    if (stat(filename, &statbuf) == -1)
    {
        printf("failed to stat %s\n", filename);
        exit(EXIT_FAILURE);
    }

    printf("[*] stat_filesize - file: %s, size: %lld\n", filename, statbuf.st_size);

}

void
seek_filesize(const char *filename)
{
    int fd;
    off_t off;

    if (filename == NULL)
    {
        printf("invalid filename\n");
        exit(EXIT_FAILURE);
    }

    fd = open(filename, O_RDONLY, S_IRUSR | S_IRGRP);
    if (fd == -1)
    {
        printf("failed to open %s\n", filename);
        exit(EXIT_FAILURE);
    }

    off = lseek(fd, 0, SEEK_END);
    if (off == -1)
    {
        printf("failed to lseek %s\n", filename);
        exit(EXIT_FAILURE);
    }

    printf("[*] seek_filesize - file: %s, size: %lld\n", filename, (long long) off);

    if (close(fd) == -1)
    {
        printf("failed to close %s\n", filename);
        exit(EXIT_FAILURE);
    }
}

int
main(int argc, const char *argv[])
{
    int i;

    if (argc < 2)
    {
        printf("%s <file1> <file2>...\n", argv[0]);
        exit(0);
    }

    for(i = 1; i < argc; i++)
    {
        seek_filesize(argv[i]);
        stat_filesize(argv[i]);
        fstat_filesize(argv[i]);
        fseek_filesize(argv[i]);
    }

    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X