如何确定文件的大小(以字节为单位?
)#include <stdio.h>
unsigned int fsize(char* file){
//what goes here?
}
答案 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文件,并且可能比使用GetFileSizeEx
或stat64
等特定于平台的调用要慢。
答案 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 标准具有其自己的获取文件大小的方法。
包括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 不能直接提供确定文件长度的方法。
我们必须要动脑子。现在,我们将使用搜索方法!
#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编码,但我认为它应该可行。