如何确定C中文件的大小?

时间:2008-08-11 21:16:30

标签: c file io filesize

如何确定文件的大小(以字节为单位?

#include <stdio.h>

unsigned int fsize(char* file){
  //what goes here?
}

15 个答案:

答案 0 :(得分:131)

基于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; 
}

的变化:

  • 将文件名参数设为const char
  • 更正了缺少变量名称的struct stat定义。
  • 在出错时返回-1而不是0,这对于空文件来说是不明确的。 off_t是签名类型,因此这是可能的。

如果您希望fsize()在出错时打印邮件,可以使用:

#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;
}

在32位系统上,您应使用选项-D_FILE_OFFSET_BITS=64对其进行编译,否则off_t将仅保存最多2 GB的值。有关详细信息,请参阅Large File Support in Linux的“使用LFS”部分。

答案 1 :(得分:70)

请勿使用int。如今,超过2千兆字节的文件很常见

请勿使用unsigned int。超过4千兆字节的文件通常是一些略微不常见的污垢

IIRC标准库将off_t定义为无符号64位整数,这是每个人都应该使用的。当我们开始有16个exabyte文件时,我们可以在几年内将其重新定义为128位。

如果你在Windows上,你应该使用GetFileSizeEx - 它实际上使用一个有符号的64位整数,所以他们将开始遇到8个exabyte文件的问题。愚蠢的微软! : - )

答案 2 :(得分:29)

Matt的解决方案应该有效,除了它是C ++而不是C,并且初始告诉不应该是必要的。

unsigned long fsize(char* file)
{
    FILE * f = fopen(file, "r");
    fseek(f, 0, SEEK_END);
    unsigned long len = (unsigned long)ftell(f);
    fclose(f);
    return len;
}

也为你修好了支具。 ;)

更新:这不是最好的解决方案。它仅限于Windows上的4GB文件,并且可能比使用GetFileSizeExstat64等特定于平台的调用要慢。

答案 3 :(得分:12)

**不要这样做(why?):

  

引用我在网上找到的C99标准文档:“将文件位置指示器设置为文件结尾,与fseek(文件,0,SEEK_END)一样,具有二进制流的未定义行为(因为可能尾随空值)字符)或任何具有状态相关编码的流,不能确定地以初始移位状态结束。**

将定义更改为int,以便可以传输错误消息,然后使用fseek()和ftell()来确定文件大小。

int fsize(char* file) {
  int size;
  FILE* fh;

  fh = fopen(file, "rb"); //binary mode
  if(fh != NULL){
    if( fseek(fh, 0, SEEK_END) ){
      fclose(fh);
      return -1;
    }

    size = ftell(fh);
    fclose(fh);
    return size;
  }

  return -1; //error
}

答案 4 :(得分:5)

如果你使用std c库很好:

#include <sys/stat.h>
off_t fsize(char *file) {
    struct stat filestat;
    if (stat(file, &filestat) == 0) {
        return filestat.st_size;
    }
    return 0;
}

答案 5 :(得分:5)

POSIX

POSIX 标准具有其自己的获取文件大小的方法。
包括sys/stat.h标头以使用该功能。

简介

  • 使用stat(3)获取文件统计信息。
  • 获取st_size属性。

示例

注意:它将大小限制为4GB。如果不是Fat32文件系统,请使用64位版本!

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

int main(int argc, char** argv)
{
    struct stat info;
    stat(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}
#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char** argv)
{
    struct stat64 info;
    stat64(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}

ANSI C(标准)

ANSI C 不能直接提供确定文件长度的方法。
我们必须要动脑子。现在,我们将使用搜索方法!

简介

示例

#include <stdio.h>

int main(int argc, char** argv)
{
    FILE* fp = fopen(argv[1]);
    int f_size;

    fseek(fp, 0, SEEK_END);
    f_size = ftell(fp);
    rewind(fp); // to back to start again

    printf("%s: size=%ld", (unsigned long)f_size);
}
  

如果文件是stdin或管道。 POSIX,ANSI C 不起作用。   
  如果文件是管道或0,它将返回stdin

     

意见:   您应该改用 POSIX 标准。因为它具有64位支持。

答案 6 :(得分:4)

如果您正在构建Windows应用程序,请使用GetFileSizeEx API作为CRT文件I / O非常混乱,特别是对于确定文件长度,由于不同系统上文件表示的特殊性;)

答案 7 :(得分:3)

Google中的快速搜索找到了a method using fseek and ftell以及一个带有此问题的帖子,答案是以其他方式无法在C语言中完成。

你可以使用像NSPR这样的可移植性库(支持Firefox的库)或者检查its implementation(相当毛茸茸的)。

答案 8 :(得分:1)

我使用这组代码来查找文件长度。

//opens a file with a file descriptor
FILE * i_file;
i_file = fopen(source, "r");

//gets a long from the file descriptor for fstat
long f_d = fileno(i_file);
struct stat buffer;
fstat(f_d, &buffer);

//stores file size
long file_length = buffer.st_size;
fclose(i_file);

答案 9 :(得分:1)

试试这个 -

fseek(fp, 0, SEEK_END);
unsigned long int file_size = ftell(fp);
rewind(fp);

这样做首先是寻找文件的末尾;然后,报告文件指针的位置。最后(这是可选的)它会回退到文件的开头。请注意,fp应该是二进制流。

file_size包含文件包含的字节数。请注意,因为(根据climits.h)unsigned long类型限制为4294967295字节(4千兆字节),如果您可能处理大于此的文件,则需要找到不同的变量类型。

答案 10 :(得分:0)

这是一个简单而干净的函数,可以返回文件大小。

long get_file_size(char *path)
{
    FILE *fp;
    long size = -1;
    /* Open file for reading */
    fp = fopen(path, "r");
    fseek(fp, 0, SEEK_END);
    size = ftell(fp); 
    fp.close();
    return 
}

答案 11 :(得分:0)

我有一个仅适用于stdio.h的功能。我非常喜欢它,并且效果很好,非常简洁:

size_t fsize(FILE *File) {
    size_t FSZ;
    fseek(File, 0, 2);
    FSZ = ftell(File);
    rewind(File);
    return FSZ;
}

答案 12 :(得分:-1)

您将需要使用库函数来检索文件的详细信息。由于C完全独立于平台,因此您需要告诉我们您正在开发的平台/操作系统!

答案 13 :(得分:-2)

查看问题,ftell可以轻松获取字节数。

  long size ;
  size = ftell(FILENAME);
  printf("total size is %ld bytes",size);

答案 14 :(得分:-3)

您可以打开文件,使用

转到相对于文件底部的0偏移量
#define SEEKBOTTOM   2

fseek(handle, 0, SEEKBOTTOM)  

从fseek返回的值是文件的大小。

我很长一段时间没用C编码,但我认为它应该可行。