当前位置: 技术问答>linux和unix
请问怎样才能解决读写大文件时文件不丢失问题
来源: 互联网 发布时间:2015-06-01
本文导语: 在linux下总会出现读写大文件时,有数据丢失的问题,请问这是linux本身的bug, 还是有解决办法啊? 请高手指教 | 嘿,先生们,我们使用 off_t lseek(int fildes, off_t offset, int whence); int fseeko(F...
在linux下总会出现读写大文件时,有数据丢失的问题,请问这是linux本身的bug, 还是有解决办法啊?
请高手指教
请高手指教
|
嘿,先生们,我们使用
off_t lseek(int fildes, off_t offset, int whence);
int fseeko(FILE *stream, off_t offset, int whence);
给文件定位,off_t 通常就是32位的long int,这样支持的最大文件长度是2^31-1(2G-1),如果文件超过2G就没法处理了。
但如果我们定义:
#define _FILE_OFFSET_BITS 64
那么,off_t就是64位的long int,支持4G文件大小绰绰有余。
这样只是解决了lseek的问题,读写文件是否还会出现其他问题,我没有试验过,不敢妄言。
off_t lseek(int fildes, off_t offset, int whence);
int fseeko(FILE *stream, off_t offset, int whence);
给文件定位,off_t 通常就是32位的long int,这样支持的最大文件长度是2^31-1(2G-1),如果文件超过2G就没法处理了。
但如果我们定义:
#define _FILE_OFFSET_BITS 64
那么,off_t就是64位的long int,支持4G文件大小绰绰有余。
这样只是解决了lseek的问题,读写文件是否还会出现其他问题,我没有试验过,不敢妄言。
|
fwrite不一定总是写入你希望写入的数据大小,只要它不返回-1就是操作正确,所以成功写入数据的范围是[0, 你要求的大小],所以一种安全的写操作应该是
int safe_write(FILE* pfile, void* buf,size_t size)
{
int w_size = 0;
int ret = 0;
//安全测试省略
while (w_size 0)
{
w_size += ret;
}
else
{
break;
}
}
return w_size;
}
int safe_write(FILE* pfile, void* buf,size_t size)
{
int w_size = 0;
int ret = 0;
//安全测试省略
while (w_size 0)
{
w_size += ret;
}
else
{
break;
}
}
return w_size;
}
|
lseek要的是文件描述符,不是FILE*。用fseeko64,注意不是fseek64。
新标准推荐fseeko/ftello,原来的fseek/ftell建议不再使用。
新标准推荐fseeko/ftello,原来的fseek/ftell建议不再使用。
|
注意要用fflush()清缓冲区,如果有多进程调用同一文件,用flock()加锁
|
就是编写程序在系统的一个目录中读出一个很大的文件写到另外的目录中,比如4G,
====================================
4G啊,老大,文件大小超过2G,就不能使用通常的操作方法了。
====================================
4G啊,老大,文件大小超过2G,就不能使用通常的操作方法了。