private void btnStart_Click(object sender, EventArgs e) { if (txtSourceFile.Text.Trim().Length == 0 || txtDestFile.Text.Trim().Length == 0) { MessageBox.Show("Файл не указан"); return; } if (thCopyFile != null) { return; } thCopyFile = new Thread(ThCopyRoutine); thCopyFile.IsBackground = true; paramCopyFile = new CopyParam(); paramCopyFile.srcFileName = txtSourceFile.Text.Trim(); paramCopyFile.destFileName = txtDestFile.Text.Trim(); paramCopyFile.frm = this; pbFileCopy.Value = 0; pbFileCopy.Minimum = 0; pbFileCopy.Maximum = 1000; pbFileCopy.Step = 100; thCopyFile.Start(paramCopyFile); }
private void btnStart_Click(object sender, EventArgs e) { MessageBox.Show("Копирование файла идет не по 4096 кб, а по 200кб. Сделано специально, чтобы можно было успеть поставить процесс на паузу.", "ВНИМАНИЕ", MessageBoxButtons.OK, MessageBoxIcon.Warning); if (txtSourceFile.Text.Trim().Length == 0 || txtDestFile.Text.Trim().Length == 0) { MessageBox.Show("Не указаны рабочие файлы"); return; } if (thCopyFile != null) { return; } thCopyFile = new Thread(ThCopyRoutine); thCopyFile.IsBackground = true; paramCopyFile = new CopyParam(); paramCopyFile.srcFileName = txtSourceFile.Text.Trim(); paramCopyFile.destFileName = txtDestFile.Text.Trim(); paramCopyFile.frm = this; pbFileCopy.Value = 0; pbFileCopy.Minimum = 0; // 0.0 % pbFileCopy.Maximum = 1000; // 100.0 % pbFileCopy.Step = 100; // 10.0 % thCopyFile.Start(paramCopyFile); }
int readSize = 200; //для того, чтобы можно было успеть на паузу! void ThCopyRoutine(object arg) { CopyParam par = arg as CopyParam; FileStream src = new FileStream(par.srcFileName, FileMode.Open, FileAccess.Read); FileStream dst = new FileStream(par.destFileName, FileMode.OpenOrCreate, FileAccess.Write); // временный буффер для чтения-записи byte[] buf = new byte[readSize]; // Получение длины файла FileInfo fi = new FileInfo(par.srcFileName); long fileSize = fi.Length; long readAll = 0; while (!par.IsStop) { int readBytes = src.Read(buf, 0, readSize); dst.Write(buf, 0, readBytes); // общее число прочтенных байтов readAll += readBytes; // 0...1000 ==> 0.0 ... 100.0 int readProcent = (int)((double)readAll / fileSize * 100.0 * 10 + 0.5); //par.frm.pbFileCopy.Value = ReadProcent; par.frm.pbFileCopy.Invoke(new Action <int>( (x) => { par.frm.pbFileCopy.Value = x; //par.frm.pbFileCopy.Invalidate(); par.frm.pbFileCopy.Update(); }), readProcent); //if (readBytes < ReadSize) { if (readAll == fileSize) { par.IsStop = true; //break; } par.evnPause.WaitOne(); } }
void ThCopyRoutine(object arg) { CopyParam par = arg as CopyParam; FileStream src = new FileStream(par.srcFileName, FileMode.Open, FileAccess.Read); FileStream dst = new FileStream(par.destFileName, FileMode.OpenOrCreate, FileAccess.Write); byte[] buf = new byte[readSize]; FileInfo fi = new FileInfo(par.srcFileName); long fileSize = fi.Length; long readAll = 0; while (!par.IsStop) { int readBytes = src.Read(buf, 0, readSize); dst.Write(buf, 0, readBytes); readAll += readBytes; int readProcent = (int)((double)readAll / fileSize * 100.0 * 10 + 0.5); par.frm.pbFileCopy.Invoke(new Action <int>( (x) => { par.frm.pbFileCopy.Value = x; par.frm.pbFileCopy.Update(); }), readProcent); if (readAll == fileSize) { par.IsStop = true; } par.evnPause.WaitOne(); } }