你如何确定在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文件,并且可能比使用像GetFileSizeEx
或stat64
这样的特定于平台的调用速度更慢。
**不要这样做( 为什么? ):
引用我在网上找到的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代码,但我认为它应该工作。