private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string devid = (string)e.Argument; string devnum = new String(devid.Where(Char.IsDigit).ToArray()); RawDisk disk = new RawDisk(DiskNumberType.PhysicalDisk, Convert.ToInt32(devnum), FileAccess.Read); long diskReadLength = disk.SizeBytes; long totalRead = 0; int increment = (int)(((16f * 1024f * 1024f) / disk.SectorSize) * disk.SectorSize); byte[] input = new byte[increment]; Stopwatch sw = new Stopwatch(); FileStream fs = new FileStream(textBox1.Text, FileMode.Create); using (RawDiskStream diskFs = disk.CreateDiskStream()) { sw.Start(); while (true) { if (backgroundWorker1.CancellationPending) { e.Cancel = true; diskFs.Close(); fs.Close(); break; } int read = (int)Math.Min(increment, disk.SizeBytes - totalRead); int actualRead = diskFs.Read(input, 0, read); if (actualRead == 0) { diskFs.Close(); fs.Close(); if (totalRead == diskReadLength) { readCompleteOK = true; } else { readCompleteOK = false; } break; } totalRead += actualRead; fs.Write(input, 0, input.Length); imageState imst = new imageState(); imst.progress = fsToHuman(Convert.ToUInt64(totalRead)) + " / " + fsToHuman(Convert.ToUInt64(diskReadLength)); int perc = (int)(0.5f + ((100f * totalRead) / disk.SizeBytes)); //imst.disksize = disk.SizeBytes; //imst.diskposition = totalRead; imst.percent = perc.ToString() + "% complete"; imst.speed = Math.Round(((diskFs.Position / 1048576f) / sw.Elapsed.TotalSeconds), 2).ToString() + "MB/s"; backgroundWorker1.ReportProgress(perc, imst); } } }
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { imageState imst = (imageState)e.UserState; label2.Text = imst.progress; //label5.Text = ((int)Math.Round((double)(100 * imst.diskposition) / imst.disksize)).ToString() + "% completed"; //progressBar1.Maximum = Convert.ToInt32(imst.disksize); //progressBar1.Value = Convert.ToInt32(imst.diskposition); label5.Text = imst.percent; progressBar1.Value = e.ProgressPercentage; label6.Text = imst.speed; }