`
wsql
  • 浏览: 11779665 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Linux文件编程之【系统调用】——综合实例:文件拷贝

 
阅读更多

(1) 实例源码file_copy.c

#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;			/* 源文件描述符 */
  int to_fd;			       /* 目的文件描述符 */
  int bytes_read;			/* 读到的字节数 */
  int bytes_write;			/* 写入的字节数 */
  char buffer[BUFFER_SIZE];		/* 写文件时的缓冲区大小 */
  char *ptr;

  if( argc != 3 )
    {
			fprintf( stderr,"Usage:%s fromfile tofile\n",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);
}


(2)调试过程以及结果

①编译


②查看源文件(待拷贝文件)内容




③执行拷贝


④查看目的文件内容




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics