use*_*252 4 c# winforms progress-bar
我有一个函数,它读取一个大文本文件,拆分一个部分(从给定的开始和结束),并将拆分的数据保存到另一个文本文件.因为文件太大,我需要在读取流时添加进度条将分割文本写入另一个文件时另一个.Ps.start和end给出datetime !!
using (StreamReader sr = new StreamReader(file,System.Text.Encoding.ASCII))
{
while (sr.EndOfStream == false)
{
line = sr.ReadLine();
if (line.IndexOf(start) != -1)
{
using (StreamWriter sw = new StreamWriter(DateTime.Now.ToString().Replace("/", "-").Replace(":", "-") + "cut"))
{
sw.WriteLine(line);
while (sr.EndOfStream == false && line.IndexOf(end) == -1)
{
line = sr.ReadLine();
sw.WriteLine(line);
}
}
richTextBox1.Text += "done ..." + "\n";
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
pet*_*ter 10
首先要做的是计算文件使用FileInfo的时间,
http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx
FileInfo fileInfo = new FileInfo(file);
long length = fileInfo.Length;
Run Code Online (Sandbox Code Playgroud)
我建议你这样做,
private long currentPosition = 0;
private void UpdateProgressBar(int lineLength)
{
currentPosition += line.Count; // or plus 2 if you need to take into account carriage return
progressBar.Value = (int)(((decimal)currentPosition / (decimal)length) * (decimal)100);
}
private void CopyFile()
{
progressBar.Minimum = 0;
progressBar.Maximum = 100;
currentPosition = 0;
using (StreamReader sr = new StreamReader(file,System.Text.Encoding.ASCII))
{
while (sr.EndOfStream == false)
{
line = sr.ReadLine();
UpdateProgressBar(line.Length);
if (line.IndexOf(start) != -1)
{
using (StreamWriter sw = new StreamWriter(DateTime.Now.ToString().Replace("/", "-").Replace(":", "-") + "cut"))
{
sw.WriteLine(line);
while (sr.EndOfStream == false && line.IndexOf(end) == -1)
{
line = sr.ReadLine();
UpdateProgressBar(line.Length);
sw.WriteLine(line);
}
}
richTextBox1.Text += "done ..." + "\n";
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是计算已读取文件的百分比并将进度条设置为该值.然后你不必担心长度是否很长,进度条使用int.
如果您不想截断该值,则执行此操作(转换为上面的int将始终截断小数,从而向下舍入),
progressBar.Value = (int)Math.Round(((decimal)currentPosition / (decimal)length) * (decimal)100), 0);
Run Code Online (Sandbox Code Playgroud)
这是在后台线程吗?不要忘记你必须调用this.Invoke更新进度条,否则你将得到一个跨线程异常.
| 归档时间: |
|
| 查看次数: |
12474 次 |
| 最近记录: |