我怎么能找出的文件的大小、字节?

#include <stdio.h>

unsigned int fsize(char* file){
  //what goes here?
}
有帮助吗?

解决方案

根据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 将只持有的价值为2GB。看到的"使用劳动力调查"的部分的 大文件支持在Linux 对于细节。

其他提示

不要用 int.文件超过2千兆字节的尺寸是常见的作为土的这些天

不要用 unsigned int.文件超过4千兆字节的尺寸是常见的一些稍微不太常见的污垢

请参考标准图书馆的定义 off_t 作为一个未签名的64位整数,这是什么每个人都应该使用。我们可以重新定义,是128位在几年的时候,我们开始有16台的文件。

如果你在窗,应该使用 GetFileSizeEx -它实际上使用的一个签署了64位整数,所以他们就开始打的问题8的文字的文件。愚蠢的微软!:-)

马特的解决方案应工作,除了它的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;
}

固定你准备你了。;)

更新:这不是真的最好的解决办法。这是限于4G文件,在Windows并很可能低于仅仅使用一种特定平台呼叫喜欢 GetFileSizeExstat64.

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

引用C99标准的医生,我在网上找到的:"设置文件的指示器位置,以最终文件,作为与fseek(文件,0,SEEK_END),具有不确定行为的一个二流(因为可能的后null人物)或者用于任何流与国家依赖编码,不肯定的结束,在初始转移的状态。**

改变定义int使得错误信息,可以传送,然后使用fseek()and 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
}

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

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 不直接提供的方式来确定长度的文件。
我们将必须使用我们的心灵。现在,我们将使用所寻求的方法!

概要

  • 寻求的文件以结束使用 fseek(3).
  • 获得当前的位置,使用 ftell(3).

#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位的支持。

如果你建立一个Windows的应用程序,使用 GetFileSizeEx API为CRT文件I/O混乱,特别是用于确定文件长度,由于特殊性在文件表示在不同的系统;)

快速搜索的在谷歌找到 方法的使用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);

试试这个--

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

这不会是第一个,找到结束文件;然后,报告在文件指针。最后(这是可选)它倒回到开头的文件。注意, fp 应该是一个二流。

file_size包含的数字节的文件包含的内容。注意,由于(根据climits.h)unsigned long类型限于4294967295字节(4千兆字节),你会需要找到一个不同的变量类型,如果你有可能处理的文件比大。

这里有一个简单和清洁能返回的文件的大小。

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 
}

你要需要使用一个图书馆功能检索的细节的文件。C是完全独立的平台,你们需要让我们知道平台/操作系统正在开发。

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

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

你可以打开文件,转到0相对偏从底部的文件

#define SEEKBOTTOM   2

fseek(handle, 0, SEEKBOTTOM)  

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top