Панель чтения / записи текстового файла в C # - PullRequest
4 голосов
/ 20 декабря 2011

У меня есть функция, которая читает большой текстовый файл, разделяет часть (от заданного начала и конца) и сохраняет разделенные данные в другой текстовый файл. Поскольку файл слишком большой, мне нужно добавить индикатор выполнения, когда чтение потока и другого при записи разделенного текста в другой файл. 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 Ответ

10 голосов
/ 20 декабря 2011

Первое, что нужно сделать, это выяснить, как долго файл использует 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);

Это в фоновом потоке? Не забывайте, что вам придется вызывать это. Вызовите для обновления индикатор выполнения, иначе вы получите исключение кросс-потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...