#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
long long get_file_size(const char *filename)
{
struct stat buf;
if(stat(filename, &buf)<0)
{
return 0;
}
return (long long)buf.st_size;
}
long long ftell_test(const char *d)
{
FILE *fp;
off_t l;
fp = fopen(d, "r");
fseek(fp, 0L, SEEK_END);
l = ftello(fp);
fclose(fp);
return l;
}
int main(void) {
printf("%lld B/n", get_file_size("/opt/public/rhel-server-5.4-i386-dvd.iso"));
printf("%lld B/n", ftell_test("/opt/public/rhel-server-5.4-i386-dvd.iso") );
printf("%d /n", sizeof(long long) );
printf("%d /n", sizeof(off_t) );
return 0;
}
有两种方法,
一种是用 ftello, 一种是用stat函数。
重要的是要加上
#define _FILE_OFFSET_BITS 64
但是这两个函数对块设备文件,计算的结果不一致。
字符设备好像是一样的。
#define _FILE_OFFSET_BITS 64#include #include #include long long get_file_size(const char *filename){ struct stat buf; if(stat(filename, &buf) {
先说点题外话, 最近某模块缩容, 导致单机任务堆积,
超过
了
2G
, fopen就失败了。 开始怀疑是
文件
权限问题, 但排查后, 发现不是, 但依然找不到原因, 后来某哥敏锐地发现,
文件
的值在
2G
左右, 于是怀疑这里有问题, 于是上网一查, 果然如此。
我不写了, 直接转载网上文章描述这个问题, 转载地址:
http://blog.163.com/qimo60
C语言
获取
超大
文件
(
超过
2G
)大小的功能
昨天在使用fseek及
ftell
获取
大小
超过
2G
的
文件大小
时发现
ftell
获取
到的值为-1,即便其返回值类型定义为long long还是为-1.
经过查阅文档才发现,针对超大
文件
有新的函数可以
获取
文件大小
。
fseeko64 和
ftell
o64两个方法结合就能得出
文件
正确的大小了。
使用方式如下:
off64_t get
File
Size(char *
file
Path) {
FILE
*f;
f = fopen(
file
Path, "rb");
一般而言,用C的
FILE
操作
文件
,只能支持到
2G
大小,
超过
2G
将不能fseek
ftell
(因为int最大到
2G
)。
windows下可以更换fseek函数和
ftell
函数
将fseek换成_fseeki64 (注意下划线)
将
ftell
换成_
ftell
i64 (注意下划线)
然后偏移量如果大于
2G
,则用__int64 类型的数据即可
要输出__int64类型的变量,可以用printf(...
最近在做视频编解码时遇到使用fseek无法定位到一个大于
2G
的
文件
尾,由于自己功底不扎实,百思不得其解,请教大神后得知在VC平台下使用_fseeki64可以解决问题,然而自己傻乎乎的在
获取
文件
指针位置的地方依旧使用的
ftell
,中途调试N久也没结果。恍然醒悟后,将
ftell
改成和_fseeki64对应的_
ftell
i64即可。
TIPS:
1.当
文件
小于
2G
时,使用fseek和
ftell
可以获
公司的asterisk系统已经发生了两次crash,检查日志,都是在日志
文件
写满到
2G
后自动执行转储时,日志还在写继续写入而导致的。google以后,发现了下面这边文章,赞!
解决了
文件大小
限于
2G
的问题,转帖到自己的空间保留。
突破Linux上面
ftell
函数
2G
B的
文件大小
限制
http://www.demix.cn/h?z=28507
在 32 位元的 Linux 上
#include
int stat(const char *restrict pathname,
struct
stat *restrict buf);
提供
文件
名字,
获取
文件
对应属性。
int fstat(int
file
des,
struct
stat *buf);
通过
文件
描述符
获取
文件
public class Split
File
{
public static void main(String[] args) {
File
file
= new
File
("input
File
.txt");
int partCounter = 1;
int sizeOf
File
s = 1024 * 1024 * 2;// 2MB
byte[] buffer = new byte[sizeOf
File
s];
try (
File
InputStream fis = new
File
InputStream(
file
);
BufferedInputStream bis = new BufferedInputStream(fis)) {
int bytesAmount = 0;
while ((bytesAmount = bis.read(buffer)) > 0) {
//write each chunk of data into separate
file
with different number in name
String
file
PartName = String.format("%s.%03d",
file
.getName(), partCounter++);
File
new
File
= new
File
(
file
.getParent(),
file
PartName);
try (
File
OutputStream out = new
File
OutputStream(new
File
)) {
out.write(buffer, 0, bytesAmount);
} catch (IOException e) {
e.printStackTrace();