[英]stream.copyto with progress bar reporting
i want to merge 2 large files but atm my code only updates the progress after 1 file is copied is there a better way to report progress this is my copy code atm 我想合并2个大文件,但atm我的代码只更新1个文件复制后的进度是否有更好的方法来报告进度这是我的复制代码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");
You could read the file in chunks. 您可以以块的形式读取文件。
You should notify the BackgroundWorker
in between. 您应该在两者之间通知
BackgroundWorker
。
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));
}
}
}
this is the code i ended up using thanks patrick for helping a lot 这是我最终使用感谢帕特里克帮助了很多的代码
List<string> files = new List<string>();
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");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.