在C#中读/写文本文件进度条

时间:2011-12-20 01:13:16

标签: 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;
        }
    }
}

1 个答案:

答案 0 :(得分:10)

首先要做的是计算文件使用FileInfo的时间,

http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

FileInfo fileInfo = new FileInfo(file);
long length = fileInfo.Length;

我建议你这样做,

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;
            }
        }
    }
}

这是计算已读取文件的百分比并将进度条设置为该值。然后你不必担心长度是否很长,进度条使用int。

如果您不想截断该值,则执行此操作(转换为上面的int将始终截断小数,从而向下舍入),

progressBar.Value = (int)Math.Round(((decimal)currentPosition / (decimal)length) * (decimal)100), 0);

这是在后台线程吗?不要忘记你必须调用this.Invoke更新进度条,否则你将得到一个跨线程异常。