- 论坛徽章:
- 26
|
有点奇怪,用下面的模式进行文件拷贝,某些文件的拷贝的副本与原文件md5不一样,为什么?下面是我的测试代码功能是拷贝一个文件。之所以是用readline按行读取是因为有些协议如HTTP、 FTP是基于行的需要按行读取。
- rc = readline(fd1,buf,MAXLINE);
- while(rc > 0)
- {
- wn = writen(fd2,buf,rc);
- rc = readline(fd1,buf,MAXLINE);
- }
- close
复制代码 readline是自己写的函数调用read,碰到\n或文件读取完毕就返回,如果read发生错误且是EINTR错误则继续读取否则就返回 。不带缓冲效率很低。我总共写了带缓冲和不带缓冲两个版本均是同样的问题。
- ssize_t writen(int fd,const void*vptr,size_t n)
- {
- size_t nleft;
- ssize_t nwriten;
- const char *ptr;
- ptr = vptr;
- nleft = n;
- while(nleft > 0)
- {
- if (( nwriten = write(fd,ptr, nleft)) <= 0)
- {
- if (nwriten < 0 && errno == EINTR)
- nwriten = 0;
- else
- return -1;
- }
- nleft -= nwriten;
- ptr += nwriten;
- }
- return n;
- }
复制代码 发生拷贝损坏的是部分二进制文件。我现在需要分析一些协议如HTTP所以需要按行读取数据。上面的代码是我用于进行测试本地拷贝文件的。
谁能告诉我为什么会部分文件拷贝的副本md5值和原文件的不一样 |
|