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

wfuga 发布于 2018-03-22 c 最后更新 2018-03-22 01:00 544 浏览

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

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

qquas

赞同来自:

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

oqui

赞同来自:

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

punde

赞同来自:

您可以打开该文件,使用相对于文件底部的0偏移量

#define SEEKBOTTOM   2
fseek(handle, 0, SEEKBOTTOM)  
从fseek返回的值是文件的大小。 我很久没有用C语言编码了,但我认为它应该可以工作。

fearum

赞同来自:

马特的解决方案应该工作,除了它是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)要慢。

wfuga

赞同来自:

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

Quoting the C99 standard doc that i found online: "Setting the file position indicator to end-of-file, as with fseek(file, 0, SEEK_END), has undefined behavior for a binary stream (because of possible trailing null characters) or for any stream with state-dependent encoding that does not assuredly end in the initial shift state.**
将定义更改为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
}

nquae

赞同来自:

Google中的快速搜索找到了a method using fseek and ftell和一个包含这个问题的线索,并且以另一种方式在C中无法完成。 您可以使用像NSPR(支持Firefox的库)的可移植性库,或者检查its implementation(相当多毛)。

nerror

赞同来自:

请勿使用int。这些日子以来,大小超过2GB的文件常常被视为污点 请勿使用unsigned int。大小超过4GB的文件是常见的一些常见的污点 IIRC标准库将off_t定义为无符号的64位整数,这是每个人都应该使用的。我们可以在几年内将16位exabyte文件挂起时重新定义为128位。 如果你在windows上,你应该使用GetFileSizeEx - 它实际上使用了一个有符号的64位整数,所以他们会开始用8个exabyte文件来解决问题。愚蠢的微软! :-)

funde

赞同来自:

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

in_ut

赞同来自:

基于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的值。有关详细信息,请参阅Large File Support in Linux的“使用LFS”部分。

ad_est

赞同来自:

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

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

zquia

赞同来自:

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

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

ased

赞同来自:

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

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

yeum

赞同来自:

尝试这个 -

fseek(fp, 0, SEEK_END);
unsigned long int file_size = ftell(fp);
rewind(fp);
这是做什么的,首先,寻求文件的结尾;然后,报告文件指针的位置。最后(这是可选的)它回退到文件的开头。请注意,fp应该是一个二进制流。 file_size包含文件包含的字节数。请注意,由于(根据climits.h),无符号long类型被限制为4294967295个字节(4千兆字节),如果您可能要处理大于该文件的文件,则需要找到其他变量类型。