你如何确定在C文件的大小?

我怎样才能算出一个文件的大小,以字节为单位?

#include <stdio.h> unsigned int fsize(char* file){ //what goes here? } 

基于NilObject的代码:

 #include <sys/stat.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 <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的值。 有关详细信息,请参阅Linux中 “ 大文件支持 ”的“使用LFS”部分。

不要使用int 。 大小超过2GB的文件现在很常见

不要使用unsigned int 。 大小超过4GB的文件是常见的一些常见的污点

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

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

马特的解决方案应该工作,除了它是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这样的特定于平台的调用速度更慢。

**不要这样做( 为什么? ):

引用我在网上找到的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 } 

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

如果你使用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; } 

在Google的一个快速搜索发现了一个使用fseek和ftell的方法,并且带有这个问题的一个线程的答案是不能用C以另一种方式完成的。

你可以使用像NSPR (支持Firefox的库)这样的可移植性库,或者检查它的实现 (相当多毛)。

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

 //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); 

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

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

尝试这个 –

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

这是做什么的第一,寻求到文件的结尾; 然后,报告文件指针的位置。 最后(这是可选的)它倒回到文件的开头。 请注意, fp应该是一个二进制流。

file_size包含文件包含的字节数。 请注意,由于(根据climits.h),无符号long类型被限制为4294967295个字节(4千兆字节),如果您可能要处理的文件比这更大,则需要查找其他变量类型。

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

看问题, ftell可以很容易的得到字节数。

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

你可以打开这个文件,从文件底部向0偏移

 #define SEEKBOTTOM 2 fseek(handle, 0, SEEKBOTTOM) 

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

我很长一段时间没有在C代码,但我认为它应该工作。