【发布时间】:2016-07-07 20:12:16
【问题描述】:
在构造函数中。 filePathList 是列表
filePathList = SearchAccessibleFilesNoDistinct(rootDirectory, null).ToList();
还有 SearchAccessibleFilesNoDistinct 方法
IEnumerable<string> SearchAccessibleFilesNoDistinct(string root, List<string> files)
{
if (files == null)
files = new List<string>();
if (Directory.Exists(root))
{
foreach (var file in Directory.EnumerateFiles(root))
{
string ext = Path.GetExtension(file);
if (!files.Contains(file) && ext == textBox2.Text)
{
files.Add(file);
}
}
foreach (var subDir in Directory.EnumerateDirectories(root))
{
try
{
SearchAccessibleFilesNoDistinct(subDir, files);
files.Add(subDir);
}
catch (UnauthorizedAccessException ex)
{
// ...
}
}
}
return files;
}
然后我循环遍历 List filePathList
foreach (string file in filePathList)
{
try
{
_busy.WaitOne();
if (worker.CancellationPending == true)
{
e.Cancel = true;
return;
}
bool reportedFile = false;
for (int i = 0; i < textToSearch.Length; i++)
{
if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
{
resultsoftextfound.Add(file + " " + textToSearch[i]);
if (!reportedFile)
{
numberoffiles++;
MyProgress myp = new MyProgress();
myp.Report1 = file;
myp.Report2 = numberoffiles.ToString();
myp.Report3 = textToSearch[i];
backgroundWorker1.ReportProgress(0, myp);
reportedFile = true;
}
}
}
numberofdirs++;
label1.Invoke((MethodInvoker)delegate
{
label1.Text = numberofdirs.ToString();
label1.Visible = true;
});
}
catch (Exception)
{
restrictedFiles.Add(file);
numberofrestrictedFiles ++;
label11.Invoke((MethodInvoker)delegate
{
label11.Text = numberofrestrictedFiles.ToString();
label11.Visible = true;
});
continue;
}
问题在于,在 catch 部分中,restrictedFiles 只是目录而不是文件。由于 filePathList 包含文件和目录,并且当它试图在目录中搜索时,它会被抓住。它不是受限制的文件,它只是目录,根本不是文件。
这就是为什么我认为 SearchAccessibleFilesNoDistinct 方法应该只返回没有目录的文件作为项目。
例如在 filePathList 中我在索引 0 中看到:
c:\temp
在索引 1 中
c:\temp\help.txt
索引 0 中的第一项将作为受限文件进入 catch,第二项不会。
【问题讨论】:
-
只是不要将子目录添加到列表中。您有一行
files.Add(subDir);,它将子目录名称添加到列表中。只需删除该行。