获取文件大小而不读取文件

时间:2014-05-05 18:02:24

标签: c file io

有没有办法在C中获取文件的大小而不实际读取文件?我知道fseek但是因为它将'光标'设置到文件的最末端,我猜这确实读取了所有文件。

我做错了这个结论吗?有办法吗?

2 个答案:

答案 0 :(得分:5)

fseek是便携式答案。在任何理智的实现中,它将读取文件的元数据而不是其内容,以确定文件的结尾,同时拒绝在没有记录此类数据的文件系统支持的流中进行搜索。

没有其他可靠的方法可以在纯ISO C中获得文件的大小,而不是寻找到最后然后倒回;操作系统具有执行此操作的特定API,例如,在POSIX系统上,您可以使用fstat fileno上的FILE*来获取尺寸:

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

off_t filesize(FILE *fp)
{
    // error checking omitted for clarity
    int fd = fileno(fp);
    struct stat sb;

    fstat(fd, &sb);
    return sb.st_size;
}

答案 1 :(得分:0)

  

我知道fseek但是因为它设置了&#39;光标&#34;到文件的最后,我猜测它确实读取了所有文件。

没有。对于linux,它使用llseek文件操作,该操作将检查操作数是否在范围内,并且只有在该检查通过时才设置该文件描述符的偏移量。但是,它可能需要访问底层设备才能走一些文件系统的数据结构。但是它不会读到&#34;该文件的目的是,对于较大的文件,操作不应该变得更加昂贵。从技术上讲,这是依赖于文件系统的行为。

对于posix,您可以执行以下操作:

get_filesize.h

#include <stdint.h>

uint64_t get_size(const char *filename);

get_filesize_posix.c

#include "get_filesize.h"

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

uint64_t get_size(const char *filename)
{
    struct stat s;
    int ret = stat(filename, &s);
    if (ret != 0)
        perror("stat");

    return (uint64_t) s.st_size;
}