[英]Why when getting directories and files recursive it's adding to the List<string> only directories and not files?
在工作中
DirSearch(textBox3.Text, textBox2.Text, textBox1.Text, worker, e);
textbox3文本包含根目录。 在这种情况下,textbox2文本包含要搜索的扩展名,而textbox1文本包含要在每个文件中搜索的文本。
DirSearch方法
void DirSearch(string rootDirectory, string filesExtension, string textToSearch, BackgroundWorker worker, DoWorkEventArgs e)
{
List<string> filePathList = new List<string>();
List<string> restrictedFiles = new List<string>();
int overallfiles = 0;
int numberoffiles = 0;
int numberofdirs = 0;
try
{
filePathList = SearchAccessibleFilesNoDistinct(rootDirectory, null).ToList();
}
catch (Exception err)
{
string ad = err.ToString();
}
foreach (string file in filePathList)
{
try
{
_busy.WaitOne();
if (worker.CancellationPending == true)
{
e.Cancel = true;
return;
}
List<MyProgress> prog = new List<MyProgress>();
int var = File.ReadAllText(file).Contains(textToSearch) ? 1 : 0;
overallfiles++;
if (var == 1)
{
numberoffiles++;
prog.Add(new MyProgress { Report1 = file, Report2 = numberoffiles.ToString() });
backgroundWorker1.ReportProgress(0, prog);
}
numberofdirs++;
label1.Invoke((MethodInvoker)delegate
{
label1.Text = numberofdirs.ToString();
label1.Visible = true;
});
}
catch (Exception)
{
restrictedFiles.Add(file);
continue;
}
}
}
在DirSearch方法内部,我调用方法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;
}
最后,我在列表文件中仅看到目录,而根本看不到文件。
然后,在DirSearch中尝试搜索文件时,由于没有文件,只有目录才成为例外。
我现在检查,发现在方法SearchAccessibleFilesNoDistinct中,在添加此部分以检查扩展名之后,问题开始了:
string ext = Path.GetExtension(file);
if (!files.Contains(file) && ext == textBox2.Text)
如果我移除零件:
&& ext == textBox2.Text
因此,如果将是:
如果(!files.Contains(file))
然后它将将所有文件添加到列表文件中。 但是,一旦我添加了此扩展名检查,它只会向文件添加目录。 根本没有文件。
不确定整个方法SearchAccessibleFilesNoDistinct与递归方法不能正常工作。
当在方法之上使用断点时,我看到根目录是root =“ d:\\ C-Sharp”,并且列表为空。
然后应该开始整个操作。
我认为您可以将它写得更短一些(在Task.Factory.StartNew内部调用以使其异步),只是快速而肮脏的示例:
var directory = @"D:\Downloads";
var extension = @"*.txt";
var textToSearch = @"abc";
var files = SearchFiles(directory, extension, SearchOption.AllDirectories);
...
private static List<string> SearchFiles(string directory, string extension, string textToSearch)
{
var results = new List<string>();
var files = Directory.GetFiles(directory, extension, SearchOption.AllDirectories);
foreach (var file in files)
{
var content = File.ReadAllText(file);
if (content.Contains(textToSearch))
{
results.Add(file);
}
}
return results;
}
textBox2.Text的值为
cs
(小写字母)
您使用Path.GetExtension
方法获得了文件扩展名。 该方法返回指定的路径的扩展名,包括句点“。”。 因此,您应该在文本框中输入.cs
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.