stream.copyto con report sulla barra di avanzamento

Voglio unire 2 file di grandi dimensioni ma atm il mio codice aggiorna solo i progressi dopo che 1 file è stato copiato c’è un modo migliore per segnalare progressi questo è il mio codice di copia atm

max = files.Count; MessageBox.Show("Merge Started"); using (Stream output = File.OpenWrite(dest)) { foreach (string inputFile in files) { using (Stream input = File.OpenRead(inputFile)) { input.CopyTo(output); count++; progress = count * 100 / max; backgroundWorker2.ReportProgress(Convert.ToInt32(progress)); } } } MessageBox.Show("Merge Complete"); 

Puoi leggere il file in blocchi.

Dovresti avvisare il BackgroundWorker in mezzo.

 using (Stream output = File.OpenWrite(dest)) { foreach (string inputFile in files) { using (Stream input = File.OpenRead(inputFile)) { byte[] buffer = new byte[16 * 1024]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, read); // report progress back progress = (count / max + read / buffer.Length /* part of this file */) * 100; backgroundWorker2.ReportProgress(Convert.ToInt32(progress)); } count++; progress = count * 100 / max; backgroundWorker2.ReportProgress(Convert.ToInt32(progress)); } } } 

questo è il codice che ho usato grazie a patrick per aver aiutato molto

  List files = new List(); if (file1 != null && file2 != null) { files.Add(file1); files.Add(file2); } if (file3 != null) { files.Add(file3); } if (file4 != null) { files.Add(file4); } max = files.Count; MessageBox.Show("Merge Started"); using (Stream output = File.OpenWrite(dest)) { foreach (string inputFile in files) { using (Stream input = File.OpenRead(inputFile)) { byte[] buffer = new byte[32 * 1024]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, read); count++; // report progress back progress = count * 100 / read; backgroundWorker2.ReportProgress(Convert.ToInt32(progress)); } } } } MessageBox.Show("Merge Complete");