【问题标题】:Read/Write text file progressbar in C#在 C# 中读/写文本文件进度条
【发布时间】:2011-12-20 01:13:15
【问题描述】:

我有一个读取大文本文件的功能,分割一部分(从给定的开始和结束),并将分割后的数据保存到另一个文本文件中。由于文件太大,我需要添加一个进度条在将拆分后的文本写入另一个文件时读取流和另一个流。Ps.start 和 end 给出日期时间!!

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

【问题讨论】:

  • 请展开。你在谈论silverlight,winforms,WPF吗?等
  • 您需要考虑的另一件事是您是否希望进度条从 0 开始到 100,而不是一个反复循环的进度条。如果是这样,那么您需要有一种方法来计算文件有多少行,以便您可以准确地报告进度。
  • 为了阅读它可以循环显示搜索正在进行中..当 (line.IndexOf(start) != -1) 为真时,进度条应该精确到直到它写完了。
  • 我无法真正预测 start 和 end 之间有多少行,因为它是一种搜索行直到出现请求的结尾。或者你怎么想?
  • 也许我在下面的建议会使这变得不必要,而不是行数,文件中的字节数。

标签: c# winforms progress-bar


【解决方案1】:

首先要做的是计算文件使用 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;
            }
        }
    }
}

计算已读取文件的百分比并将进度条设置为该值。那你就不用管长度是不是long了,进度条用的是int。

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

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

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

【讨论】:

  • 这似乎没问题..但你认为这仅在搜索开始而不是在写作时有效..或者我错过了什么..
  • fileInfo.Length 必须是 long..progressBar.Maximum 必须是 int 类型,这不起作用。
  • 你可以把最小的0和最大的100做一个计算并四舍五入。我会更新答案。
  • 您的其他评论 - 但您认为这仅在搜索开始时有效,而不是...。我不关注。这应该会更新读取的输入文件的每一行的进度条。
  • 看看还有一行 = sr.ReadLine();在streamwriter里面!!所以进度条会在找到开始之前更新,之后不再更新。(在阅读时而不是在阅读和写作时)。谢谢彼得..
猜你喜欢
  • 2012-01-22
  • 1970-01-01
  • 2013-07-19
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多