c#实现多线程复制文件

要求复制速度达到180m每秒,磁盘采用列阵,速度绝对能跟上。因此需要多线程复制文件。只针对一个文件的复制。求指导!能有代码最好

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();
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-10
多个线程复制同一个文件,这样会越来越慢吧,相比单线程,做了更多的事,怎么可能更快呢?
第2个回答  2013-08-22
文件复制不是下载 多线程有用吗,复制速度是与硬件有关的追问

我知道 机器是8硬盘组成的盘阵 数度可达到知道500M每秒,网络是万M光钎。普通的复制达不到预想的速度。

求C#代码,按钮复制文件和进度条显示复制进度。谢谢大侠们!!
开始复制按钮事件:创建复制线程,在线程中:1.计算文件个数(建议用这个,速度快),计算百分比,完成进度条功能(可以做成函数,调用)。2.复制文件,读进度条。3.把开始复制按钮的label修改成取消复制,并修改该按钮的标志位,用于调用取消\/删除文件的函数。4.结束线程,释放资源。注意,若不用线程,...

C#多线程实现大量文件读取
1、读取所有的文件名,按照需求,分成90个字符串数组 2、启动thread线程或者delegate委托事件来执行文件的读取,传递的参数就是上面的数组中的一个 3、线程中读取文件列表的方法。这个要看你要做什么了。我不知道你读取文件要做什么,如果要插入资料库的话,你还得考虑不同线程读取资料库会不会锁表。具...

C# 利用多线程进行,导入和导出! 希望各位能给一个实例! 最好有注释...
Process myApp = new Process();myApp.StartInfo.CreateNoWindow=false;myApp.StartInfo.FileName = "bcp.exe";myApp.StartInfo.Arguments = "bcp AdventureWorks.sales.currency out c:\\\\currency1.txt -c -U \\"sa\\" -P \\"password\\"";\/\/使用密码连接,导出数据,out改为in则为导入,currency1.t...

C# 多线程对同一文件进行读操作【只读不写】需不需要加锁
不用加锁,每个线程相当于重新打开这个文件,各自读各自的,互不干扰的。

c#多线程有几种实现
1)使用Thread类创建一个新线程 static void Main(string[] args){ Thread thread = new Thread(delegate(){ for (int i = 0; i <= 10; i++){ Console.WriteLine(Thread.CurrentThread.Name + ":" + i); Thread.Sleep(100); } }); thread.Name = "t1 thread";...

c# 多线程写入文本文件的困扰
貌似文件打开的时候会锁定住,这样另一个线程不能操作了。我是这样理解的。但是你的写方法貌似没有检测文件是否被打开,没有检查是否锁定这一过程,这样如果一个线程在对文件进行操作,另一个也在对文件进行操作,这样就会出错。

多线程保存文件报错c#
1、文件访问冲突:当多个线程试图同时写入同一个文件时,会出现竞争条件。如果两个线程试图在同一时间写入文件的相同部分,会导致数据损坏或者写入的数据不完整。为了解决这个问题,可以使用文件锁(FileLock)来确保在给定时间内只有一个线程可以写入文件。2、文件访问冲突:当多个线程试图同时写入同一个文件...

C#多线程读取文件
fbd.Description = "选择要多线程读取文件的路径";fbd.ShowNewFolderButton = false;if (fbd.ShowDialog(this) == DialogResult.OK){ DirectoryInfo di = new DirectoryInfo(fbd.SelectedPath);foreach (FileInfo fi in di.GetFiles("*.txt")){ Thread t = new Thread(this.InvokeThread);t.Start...

c#多线程读文件会快吗
你可能没理解多线程的作用哈,我是这样理解的,你用n个多线程去处理一个文件那么所用的时间是和单线程一样的,如果你用多线程去(每个线程一定是有区域条件的)一堆文件,那你用的时间会比单线程少,所以你这个读文件是一个还是多个呢

在C#中如何实现两个线程交替工作
我个人认为要用两个线程交替工作,一开始线程1工作,一直监视程序运行,一分钟后线程1将数据写入文本文件,这时候线程2开始监视程序运行,一分钟后将数据写入文本,不然我觉得一个线程写会漏掉数据。大家觉得可行吗,有实现的代码就更好了。之前一直没接触过多线程编程问题,有点无处下手的感觉。

相似回答