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