原文链接:https://blog.csdn.net/xiaokuang5020/article/details/74644866
一、获取文件大小
-
/*测得文件大小*/
-
int filelen;
-
int fd;
-
int filelen= lseek(fd,0L,SEEK_END);
-
lseek(fd,0L,SEEK_SET);
-
printf("file size is %d\n",filelen);
二、lseek使用说明
表头文件
#include<sys/types.h>
#include<unistd.h>
定义函数
off_t lseek(int filde,off_t offset ,int whence);
EEK_SET 将读写位置指向文件头后再增加offset个位移量。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
下列是较特别的使用方式:
1) 欲将读写位置移到文件开头时:
lseek(int fildes,0,SEEK_SET);
2) 欲将读写位置移到文件尾时:
lseek(int fildes,0,SEEK_END);
3) 想要取得目前文件位置时:
lseek(int fildes,0,SEEK_CUR);
返回值
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。
可能设置erron的错误代码:
EBADF: fildes不是一个打开的文件描述符。
ESPIPE:文件描述符被分配到一个管道、套接字或FIFO。
EINVAL:whence取值不当。
代码列子:
-
#define BUFFER_SIZE 1024
-
int main(int argc,char **argv)
-
{
-
int readfd, writefd;
-
long filelen=0;
-
int ret=1;
-
char buffer[BUFFER_SIZE];
-
char *ptr;
-
/*打开源文件*/
-
if((readfd=open("test.txt", O_RDONLY|O_CREAT)) == -1)
-
{
-
printf("Open Error\n");
-
exit(1);
-
}
-
/*创建目的文件*/
-
if((writefd=open("dest.txt", O_WRONLY|O_CREAT)) == -1)
-
{
-
printf("Open Error\n");
-
exit(1);
-
}
-
/*测得文件大小*/
-
filelen= lseek(readfd,0L,SEEK_END);
-
lseek(readfd,0L,SEEK_SET);
-
printf("read file size is %d\n",filelen);
-
/*进行文件拷贝*/
-
while(ret)
-
{
-
ret= read(readfd, buffer, BUFFER_SIZE);
-
if(ret==-1)
-
{
-
printf("read Error\n");
-
exit(1);
-
}
-
write(writefd, buffer, ret);
-
filelen-=ret;
-
bzero(buffer,BUFFER_SIZE);
-
}
-
close(readfd);
-
close(writefd);
-
exit(0);
-
}