file_cp文件拷贝分析
2013-10-21 21:12
267 查看
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#define BUFFER_SIZE 1024
int main(int argc,char **argv)
{
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if(argc!=3)
{
fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);
exit(1);
}
/* 打开源文件 */
if((from_fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
exit(1);
}
/* 创建目的文件 */
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));
exit(1);
}
/* 以下代码是一个经典的拷贝文件的代码 */
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
/* 一个致命的错误发生了 */
if((bytes_read==-1)&&(errno!=EINTR)) break;
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
/* 一个致命错误发生了 */
if((bytes_write==-1)&&(errno!=EINTR))break;
/* 写完了所有读的字节 */
else if(bytes_write==bytes_read) break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
} /*此为没写完继续写的情况*/
}
/* 写的时候发生的致命错误 */
if(bytes_write==-1)break;
}
}
close(from_fd);
close(to_fd);
exit(0);
}
PS:1.fprint为格式化输出到文件,配合stderr使用,则可在终端显示,因为stderr默认终端显示标准错误。两者用法为
fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
2.errno!=EINTR
如果在读的过程中遇到了中断那么会返回-1,同时置errno为EINTR
3. 大写的为库文件定义的宏,如BUFFER_SIZE为文件大小
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#define BUFFER_SIZE 1024
int main(int argc,char **argv)
{
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if(argc!=3)
{
fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);
exit(1);
}
/* 打开源文件 */
if((from_fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
exit(1);
}
/* 创建目的文件 */
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));
exit(1);
}
/* 以下代码是一个经典的拷贝文件的代码 */
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
/* 一个致命的错误发生了 */
if((bytes_read==-1)&&(errno!=EINTR)) break;
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
/* 一个致命错误发生了 */
if((bytes_write==-1)&&(errno!=EINTR))break;
/* 写完了所有读的字节 */
else if(bytes_write==bytes_read) break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
} /*此为没写完继续写的情况*/
}
/* 写的时候发生的致命错误 */
if(bytes_write==-1)break;
}
}
close(from_fd);
close(to_fd);
exit(0);
}
PS:1.fprint为格式化输出到文件,配合stderr使用,则可在终端显示,因为stderr默认终端显示标准错误。两者用法为
fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
2.errno!=EINTR
如果在读的过程中遇到了中断那么会返回-1,同时置errno为EINTR
3. 大写的为库文件定义的宏,如BUFFER_SIZE为文件大小
相关文章推荐
- C语言拷贝文件函数实现(linux cp [source file] [target file] 命令的实现)
- 文件路径分析File::Basename(转)
- sendfile优化文件拷贝
- File 经典拷贝文件代码
- Linux cp命令拷贝 不覆盖原有的文件
- ubuntu下文件拷贝命令cp命令
- Java IO和Java NIO在文件拷贝上的性能差异分析
- jquery插件--ajaxfileupload.js上传文件原理分析
- 拷贝本地文件至HDFS异常:No FileSystem for scheme: file
- java的File类的 delete方法删不掉文件的原因分析
- WINAPI 拷贝指定的hDC的lpRect部分到文件Dstfile中(BMP文件格式)
- C语言的FILE*读取文件比CFile要快的原因分析
- Java IO和Java NIO在文件拷贝上的性能差异分析
- cp 拷贝文件的时间
- ubuntu下文件拷贝命令cp命令
- 从XCode添加File的错误Multiple errors occurred while copying the files分析Cocos2d-x在XCode工程中添加文件
- gcp – 源于CP的高级命令行文件拷贝工具
- GUN cp 与 tar 拷贝文件速度 比较 推荐
- Windows与Linux系统拷贝文件之pscp的使用
- 分析异步上传文件的原理 ajaxUploadFile