WEB开发网
开发学院软件开发VC ftp协议实现多线程断点续传 阅读

ftp协议实现多线程断点续传

 2006-07-21 11:15:21 来源:WEB开发网   
核心提示: FTP多线程下载技术部分:前面我介绍了文件的保存技巧,主要也是为了多线程服务,ftp协议实现多线程断点续传(4),现在有个namelock.avi文件需要下载,文件的大小为:364544字节,当某个线程进入读写文件时必须设置FileLocked = true;访问文件完毕必须将FileLo

FTP多线程下载技术部分:前面我介绍了文件的保存技巧,主要也是为了多线程服务。现在有个namelock.avi文件需要下载。文件的大小为:364544字节。要用8个下载线程。 第一步:将namelock.avi文件分成8个子模块。这里要注意的地方是我所说的分成8个字模块,并不是把文件的内容分别存放到8个不同的缓冲区里。而是生成8个不同的文件偏移量。很多时候程序员为了偷懒往往容易一次性讲文件读入内存,这样带来的后果是不堪设想的。一个比较理想的方法是这样的。 bool DealFile(string fileName)  //随便写个函数说明
{
  FILE *file;
  DWORD fileSize ,pos;
  int readLen ;
  //MAX_BUFFER_LEN 在头文件里定义,这里能够保证数据不丢失,也不至于内存逸出
  char *buffer = new char[MAX_BUFFER_LEN];
  file = fopen(fileName.c_str(),"r+b");
  if(file == NULL) return false;
  fseek(file,0,2);
  fileSize = ftell(file);  //取得文件的大小
  fseek(file,0,0);
  do{
    readLen = fread(buffer,sizeof(char),MAX_BUFFER_LEN,file);
    if(readLen > 0)
     {
      pos += readLen;
      //对读取的文件做处理
     }
   }while(pos < fileSize);  //循环读取文件
 delete[] buffer;
 fclose(file);  //释放资源
 return true;
}

8个线程下载文件时,都要对内容文件和配置文件进行读写。这样如果没有处理好,很有可能会造成访问文件失败,我定义了一个全局变量FileLocked,如果FileLocked=true说明文件正在被某个线程访问。所以使用Sleep(10)睡眠等待。当某个线程进入读写文件时必须设置FileLocked = true;访问文件完毕必须将FileLocked = false;这样就能很好的控制各个线程对文件的访问了。(对临界资源的访问有API提供了很多很好的解决方法,请查阅)。

上一页  1 2 3 4 5  下一页

Tags:ftp 协议 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接