【发布时间】:2016-07-04 06:54:51
【问题描述】:
foreach (string file in filePathList)
{
try
{
_busy.WaitOne();
if (worker.CancellationPending == true)
{
e.Cancel = true;
return;
}
for (int i = 0; i < textToSearch.Length; i++)
{
List<MyProgress> prog = new List<MyProgress>();
if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
{
resultsoftextfound.Add(file + " " + textToSearch[i]);
numberoffiles++;
prog.Add(new MyProgress { Report1 = file, Report2 = numberoffiles.ToString(), Report3 = textToSearch[i] });
backgroundWorker1.ReportProgress(0, prog);
}
}
numberofdirs++;
label1.Invoke((MethodInvoker)delegate
{
label1.Text = numberofdirs.ToString();
label1.Visible = true;
});
}
catch (Exception)
{
restrictedFiles.Add(file);
continue;
}
}
MyProgress 类
public class MyProgress
{
public string Report1 { get; set; }
public string Report2 { get; set; }
public string Report3 { get; set; }
}
当 textToSearch 包含多于一项时的内部循环例如:
你好,世界
如果同一个文件中存在两个以上的单词,它将根据文件中找到的单词/文本的数量报告同一个文件两次或三次。
如何保持循环多次查找文件中的文本,但只报告一次文件的进度?
此行只报告一次。 如果在一个文件中发现 2 或 3 个结果报告仅一次。在许多情况下,它会报告同一个文件的两倍或三倍。
backgroundWorker1.ReportProgress(0, prog);
稍后在 progresschanged 中,我将文件作为字符串添加到 listView
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
List<MyProgress> mypro = e.UserState as List<MyProgress>;
ListViewCostumControl.lvnf.Items.Add(mypro[0].Report1);
label15.Text = mypro[0].Report2;
label15.Visible = true;
if (ListViewCostumControl.lvnf.Items.Count > 9)
textBox4.Enabled = true;
}
这一行将文件结果添加到列表视图中
ListViewCostumControl.lvnf.Items.Add(mypro[0].Report1);
我不想改变循环只是为了让它在完成搜索后报告每个文件以报告一次。
【问题讨论】: