我正在逐个从子文件夹中逐行读取文本文件。这意味着一旦它完成了包含一个子文件夹的所有文本文件的读取,然后开始从下一个子文件夹中读取文件。你可以从我的代码中理解。一切正常,我想要的是当它从第一个文件开始读取时显示进度条,然后在执行完成时隐藏进度条。任何帮助都可以得到赞赏。以下是我的代码:
private void browse_Click(object sender, EventArgs e)
{
try
{
string newFileName1 = "";
string newFileName2 = "";
week = textBox2.Text;
if (week == null || week == "")
{
MessageBox.Show("Week cannot be null.");
return;
}
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
DateTime starttime = DateTime.Now;
string folderPath = Path.GetDirectoryName(folderBrowserDialog1.SelectedPath);
string folderName = Path.GetFileName(folderPath);
DirectoryInfo dInfo = new DirectoryInfo(folderPath);
foreach (DirectoryInfo folder in dInfo.GetDirectories())
{
newFileName1 = "Files_with_dates_mismatching_the_respective_week_" + folder.Name + ".txt";
newFileName2 = "Files_with_wrong_date_format_" + folder.Name + ".txt";
if (File.Exists(folderPath + "/" + newFileName1))
{
File.Delete(folderPath + "/" + newFileName1);
}
if (File.Exists(folderPath + "/" + newFileName2))
{
File.Delete(folderPath + "/" + newFileName2);
}
FileInfo[] folderFiles = folder.GetFiles();
if (folderFiles.Length != 0)
{
List<Task> tasks = new List<Task>();
foreach (var file in folderFiles)
{
var task = ReadFile(file.FullName, folderPath, folder.Name, week);
tasks.Add(task);
}
Task.WhenAll(tasks.ToArray());
DateTime stoptime = DateTime.Now;
TimeSpan totaltime = stoptime.Subtract(starttime);
label6.Text = Convert.ToString(totaltime);
textBox1.Text = folderPath;
}
}
DialogResult result2 = MessageBox.Show("Read the files successfully.", "Important message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception)
{
throw;
}
}
public async Task ReadFile(string file, string folderPath, string folderName, string week)
{
int LineCount = 0;
string fileName = Path.GetFileNameWithoutExtension(file);
using (FileStream fs = File.Open(file, FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
for (int i = 0; i < 2; i++)
{
sr.ReadLine();
}
string oline;
while ((oline = sr.ReadLine()) != null)
{
LineCount = ++LineCount;
string[] eachLine = oline.Split(';');
string date = eachLine[30].Substring(1).Substring(0, 10);
DateTime dt;
bool valid = DateTime.TryParseExact(date, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
if (!valid)
{
StreamWriter sw = new StreamWriter(folderPath + "/" + "Files_with_wrong_date_format_" + folderName + ".txt", true);
await sw.WriteLineAsync(fileName + " " + "--" + " " + "Line number :" + " " + LineCount);
sw.Close();
}
else
{
DateTime Date = DateTime.ParseExact(date, "d/M/yyyy", CultureInfo.InvariantCulture);
int calculatedWeek = new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(Date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Saturday);
if (calculatedWeek == Convert.ToInt32(week))
{
}
else
{
StreamWriter sw = new StreamWriter(folderPath + "/" + "Files_with_dates_mismatching_the_respective_week_" + folderName + ".txt", true);
await sw.WriteLineAsync(fileName + " " + "--" + " " + "Line number :" + " " + LineCount);
sw.Close();
}
}
}
}
}
答案 0 :(得分:1)
是否要显示每个文件本身或所有文件的进度?
您可以通过以下方式获取文件大小:
FileInfo fileInfo = new FileInfo(file);
long fileLength = fileInfo.Length;
将进度条最小值设置为0,最大值设置为100。 创建一个包含当前流位置的变量,然后使用以下命令更新进度条:
(int)(((decimal)currentStreamPosition / (decimal)fileLength)*(decimal)100);
您可以添加所有文件大小并显示百分比,也可以在读完一个文件后将currentStreamPosition设置为零。
在获得精确的文件大小之前,您必须遍历所有需要阅读的文件。
答案 1 :(得分:0)
通常情况下,在类似情况下,如果可能,最好显示2个进度条 - 一个用于整体进度,另一个用于当前进度条。因此,您可以先计算所有子文件夹中的所有文件以估计总体进度,然后在当前进度条中显示每个文件的读数。
如果进度条应该只有一个 - 那么只能显示整体进度。 您可以使用Directory.GetFiles方法计算文件编号。请参阅以下链接 https://msdn.microsoft.com/en-us/library/3hwtke0f.aspx