CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

求多线程读写(复制)文件

楼主doudoushen()2005-03-10 22:05:18 在 .NET技术 / C# 提问

我想用2个线程对一个很大的文件进行复制(一个读、一个写)这个怎么写     请给个代码     分不够可以加  
  谢谢 问题点数:50、回复次数:21Top

1 楼betteronly(小鸟试飞)回复于 2005-03-10 23:35:15 得分 0

偶也关注中.....Top

2 楼superhasty(鸟儿自空中飞过)回复于 2005-03-11 01:27:50 得分 5

代码没有,其实也不是很难。可以这样设想:内存中有一个公共的容器(一个队列),两个线程分别从两端操纵这个容器(读/写),一个向里面放东西,另外一个从另外一端取东西。关键是:同步问题、覆盖问题----写通常比读慢,所以可能这个容器会满了,这个时候暂时就不能再往里面放东西了。Top

3 楼Sunmast(速马@Redmond, WA)回复于 2005-03-11 01:46:30 得分 5

File.Copy的过程已经是边读边写了,用不着这么麻烦  
  另外在IO上用多线程会很危险且大部分情况下毫无意义Top

4 楼westlife_006()回复于 2005-03-11 01:53:31 得分 2

mark,正在学习中Top

5 楼wcbgyjs(阿豹)回复于 2005-03-11 08:31:13 得分 2

关注....  
  感觉没什么必要。Top

6 楼doudoushen()回复于 2005-03-11 08:34:57 得分 0

其实我也知道没什么必要     但是我想通过这个代码     搞清楚     怎样实现多线程编程     文件读写编程  
  我的几本书写的多不全     没办法     只能求求各位了Top

7 楼BigIdiot628(大笨蛋,谁叫你不努力!)回复于 2005-03-11 08:55:04 得分 0

关注!  
  Top

8 楼lonelydreamsym(惊梦)回复于 2005-03-11 09:00:13 得分 0

关注Top

9 楼amendajing(学习,是个漫长的旅途!)回复于 2005-03-11 09:03:27 得分 2

markTop

10 楼Sunmast(速马@Redmond, WA)回复于 2005-03-11 10:02:25 得分 0

从这里入门:  
  http://msdn.microsoft.com/library/CHS/cpguide/html/cpconThreading.asp?frame=trueTop

11 楼super_redsky()回复于 2005-03-11 10:07:20 得分 2

使用异步读取文件的方法就可以,有异步读取的方法,查查VS的帮助,有现成的例子。Top

12 楼chinawn(动性忍心)回复于 2005-03-11 10:13:36 得分 2

markTop

13 楼hky5_com(绿源人)回复于 2005-03-11 10:25:59 得分 2

dTop

14 楼win_web_form(笨熊)回复于 2005-03-11 11:00:07 得分 2

upTop

15 楼january03(噢噢--一直很安静)回复于 2005-03-11 11:22:46 得分 2

不是吧,竟然有这样的变态读写Top

16 楼eArt(追求e术)回复于 2005-03-11 11:25:35 得分 2

markTop

17 楼doudoushen()回复于 2005-03-11 12:36:44 得分 0

我说了     我只想知道怎样实现多线程编程     文件读写编程     我没有别的意思Top

18 楼grf601006617(宫崎锋)回复于 2005-03-11 14:27:46 得分 2

我也在烦恼~Top

19 楼sdd330(小飞羊)回复于 2005-03-11 15:41:07 得分 20

using   System;  
  using   System.Threading;  
  using   System.IO;  
   
  namespace   CopyTest  
  {  
   
  //FileBuffer用来存放和取出缓冲区变量  
  public   class   FileBuffer{  
  private   int   m_readsize   =   1024;  
  //定义了m_capacity个字节的缓冲区  
  private   byte[]   m_buffer   =   new   byte[4096];  
  //确认缓冲区内已放字节的个数  
  private   int   bufferCount=0;  
  //确定读写的位置  
  private   int   readLocation=0,writeLocation=0;  
   
  public   FileBuffer()   {  
   
  }  
   
  //从缓冲区中取数据  
  public   byte[]   getBuffer()   {  
  //加上了共享锁  
  lock(this)   {  
  //判断如果缓冲区内无内容,则读取者进入wait状态,并且释放对象锁  
  if(bufferCount==0)   {  
  Console.WriteLine("缓冲区无数据,无法读取");  
  Monitor.Wait(this);  
  }  
   
  byte[]   newBuf   =   new   byte[m_readsize];  
  Buffer.BlockCopy(m_buffer,   readLocation,   newBuf,   0,   m_readsize);  
   
  //已经从缓冲区读取了内容,所以bufferCount要进行自减.  
  bufferCount-=m_readsize;  
  //求余的目的是为了循环使用缓冲区  
  readLocation=(readLocation   +   m_readsize)%m_buffer.Length;  
  //通知对象的第一个等待线程可以从WaitSleepJoin转换到Started状态.  
  Monitor.Pulse(this);  
  //返回给读取者取出的数值  
  return   newBuf;  
  }  
  }  
   
  //将数据放入缓冲区  
  public   void   setBuffer(byte[]   writeValue)   {  
  //锁住共享数据区  
  lock(this)   {  
  //如果缓冲区已满,那么进入waitsleepjoin状态  
  if(bufferCount==m_buffer.Length)   {  
  Console.WriteLine("缓冲区溢出!");  
  Monitor.Wait(this);  
  }  
  //向缓冲区写入数据  
  Buffer.BlockCopy(writeValue,   0,   m_buffer,   writeLocation,   m_readsize);  
  //自加,代表缓冲区现在到底有几个数据  
  bufferCount+=m_readsize;  
  //用%实现缓冲区的循环利用  
  writeLocation=(writeLocation   +   m_readsize)%m_buffer.Length;  
  //唤醒waitSleepJoin状态的进程,到started状态  
  Monitor.Pulse(this);  
  }//使用lock隐式的释放了共享锁  
  }  
  }  
   
     
   
     
  //写入者类,向缓冲区中放入数据  
  public   class   Writer   {    
  //定义了同步变量  
  FileBuffer   shared;  
  FileStream   file;  
  //此处构造函数的作用是在启动类中调用写入者的时候,把启动类中定义的sharedLocation传过来  
  public   Writer(FileBuffer   sharedLocation)   {  
  file   =   new   FileStream("C:\\Test.txt",FileMode.Open);  
  shared=sharedLocation;  
  }  
  //定义写入过程  
  public   void   Write()   {  
  //将数据放入缓冲区  
  Byte[]   datas   =   new   byte[1024];  
   
  for(int   byteread=0;byteread<=file.Length;byteread   +=   datas.Length)   {  
  file.Read(datas,   byteread,   datas.Length);  
  shared.setBuffer(datas);  
  }  
   
  file.Close();  
   
  //得到当前线程的名字  
  string   name=Thread.CurrentThread.Name;  
  //此线程执行完毕  
  Console.WriteLine(name+"done   writeing");  
  }  
  }  
   
  public   class   Reader   {//定义读取者  
  byte[]   value;  
  FileStream   file;  
  //定义同步变量  
  FileBuffer   shared;  
  //定义构造函数,负责传递启动类中的shared  
  public   Reader(FileBuffer   sharedLocation)   {  
  file   =   new   FileStream("C:\\Data.txt",FileMode.Create);  
  shared=sharedLocation;  
  }  
   
  public   void   Read()   {  
  //从缓冲区中循环读取  
  for(int   bytewrite=0;bytewrite<=65535;)   {  
  value=shared.getBuffer();  
  file.Write(value,   bytewrite,   value.Length);  
  bytewrite+=value.Length;  
  }  
   
  file.Close();  
   
  //取得当前线程的名字  
  string   name=Thread.CurrentThread.Name;  
  Console.WriteLine(name+"done   reading");  
  }  
  }  
   
  public   class   ThreadTest   {   //设置为启动类  
  public   static   void   Main()   {  
  FileBuffer   shared=new   FileBuffer();  
  //初始化了写入者和读取者,并且把shared参数传递了过去  
  Writer   Writer1=new   Writer(shared);  
  Reader   Reader1=new   Reader(shared);  
   
  Thread   WriterThread   =   new   Thread(new   ThreadStart   (Writer1.Write));  
  WriterThread.Name="写入者";  
   
  Thread   ReaderThread   =   new   Thread(new   ThreadStart   (Reader1.Read));  
  ReaderThread.Name="读取者";  
  //启动这两个线程  
  WriterThread.Start();  
  ReaderThread.Start();  
  WriterThread.Join();  
  ReaderThread.Join();  
  Console.ReadLine();  
  }  
  }  
  }Top

20 楼doudoushen()回复于 2005-03-13 09:48:27 得分 0

谢谢     楼上的     我马上去是一下Top

21 楼chinawn(动性忍心)回复于 2005-03-29 23:44:44 得分 0

upTop

相关问题

  • 多线程读一个大文件的效率问题
  • 多线程读文件问题!高分求救!
  • 怎么用多线程同时读取10个文件?
  • 多线程下载文件
  • 多线程下载文件
  • 哪里有好的(多线程、断点续拷)文件复制工具,并且需要支持命令行的
  • $$$多线程同时读同一个文件 如何不发生共享冲突???
  • 请问如何解决多线程读写同一个文件的异常?
  • 请问如果多线程异步读取文件中的指定的块?
  • socket多线程传输文件 急用!

关键词

  • 多线程
  • 文件
  • 代码
  • 缓冲区
  • buffercount
  • readlocation
  • readsize
  • filebuffer
  • 容器
  • 读取

得分解答快速导航

  • 帖主:doudoushen
  • superhasty
  • Sunmast
  • westlife_006
  • wcbgyjs
  • amendajing
  • super_redsky
  • chinawn
  • hky5_com
  • win_web_form
  • january03
  • eArt
  • grf601006617
  • sdd330

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo