<pre name="code" class="csharp">BackgroundWorker background1 = new BackgroundWorker();byte[] buffer1;//HDD -> MEM
BackgroundWorker background2 = new BackgroundWorker();byte[] buffer2;//MEM -> HDD
UInt32 pointer1, pointer2;
bool abort = false;
int bytesreaded = 0;
public virtual void background1_DoWork(object sender, DoWorkEventArgs e)
{//Read Data from HDD to MEM
while ((bytesreaded = br.Read(buffer1, 0, blocksize)) > 0)
{
if (abort)
return;
while (pointer2 != pointer1)//Wait until MEM data is written
{
if (abort)
return;
}
ms.Position = 0;
ms.Write(buffer1, 0, bytesreaded);
pointer1++;
}
}
public virtual void background2_DoWork(object sender, DoWorkEventArgs e)
{//Write Data from MEM
long byteswritten=0;
while (bytesreaded>0)
{
while (!(pointer2 < pointer1))//wait until MEM data is read
{
if (abort)
return;
}
ms.Position = 0;
ms.Read(buffer2, 0, bytesreaded);
bw.Write(buffer2, 0, bytesreaded);//Test Purpose Only
byteswritten += bytesreaded;
pointer2++;
}
}
public virtual void background1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
br.Close();
}
public virtual void background2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
fs.Close();
ms.Close();
bw.Close();
string duration = DateTime.Now.Subtract(tStart).TotalSeconds.ToString();
MessageBox.Show("Done! " + duration);
}
FileStream fs; System.IO.BinaryReader br;
MemoryStream ms;
BinaryWriter bw;
long length;
DateTime tStart;
public void TransferFromFile(string filename, string copyfile, UInt16 buffersize)
{
tStart = DateTime.Now;
blocksize = buffersize;
if (background1.IsBusy || background2.IsBusy)
return;
try
{
fs = new FileStream(filename, FileMode.Open);
length = fs.Length;
br = new BinaryReader(fs, new UTF8Encoding());
ms = new MemoryStream(buffersize);
bw = new BinaryWriter(System.IO.File.Open(copyfile, FileMode.Create), new UTF8Encoding());
buffer1 = new byte[blocksize];
buffer2 = new byte[blocksize];
background1.RunWorkerAsync();
while (bytesreaded==0) { }
background2.RunWorkerAsync();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}