在这种方法中,如果我没有记错的话,它是在文件内部进行搜索。因此,当我输入searchTerm例如“ Form1”时,它发现了46个文件。
但是现在我想更改没有searchTerm的方法,这样它将遍历所有文件,但是最后我想获取所有文件类型的列表。如果有相同的dupilcate,则不要将它们添加到列表中,因此最后我将获得一个包含文件类型项的列表,例如:cs,txt,xml,这样我就知道存在哪些文件类型。
IEnumerable<string> SearchAccessibleFiles(string root, string searchTerm)
{
var files = new List<string>();
foreach (var file in Directory.EnumerateFiles(root).Where(m => m.Contains(searchTerm)))
{
files.Add(file);
}
foreach (var subDir in Directory.EnumerateDirectories(root))
{
try
{
files.AddRange(SearchAccessibleFiles(subDir, searchTerm));
}
catch (UnauthorizedAccessException ex)
{
// ...
}
}
return files;
}
问题是,如果我只是制作GetFiles,并且根目录为c:\,则它将停止并且在进入Windows 10中的目录时将不获取任何文件:文档和设置
Directory.GetFiles(textBox3.Text, "*.*", SearchOption.AllDirectories).ToList();
由于找不到通过该目录传递Directory.GetFiles的方法,因此我尝试使用递归方法。
您可以使用以下文件名来获取文件扩展名,extension = Path.GetExtension(fileName);
并通过.Distinct()
在文件列表上使用删除重复项:
IEnumerable<string> SearchAccessibleFiles(string root, string searchTerm)
{
var files = new List<string>();
foreach (var file in Directory.EnumerateFiles(root).Where(m => m.Contains(searchTerm)))
{
string extension = Path.GetExtension(file);
files.Add(extension);
}
foreach (var subDir in Directory.EnumerateDirectories(root))
{
try
{
files.AddRange(SearchAccessibleFiles(subDir, searchTerm));
}
catch (UnauthorizedAccessException ex)
{
// ...
}
}
return files.Distinct().ToList();
}
您可以简单地删除.Where(m => m.Contains(searchTerm))
要搜索的部分而无需搜索词。
编辑如果您不想使用.Distict()
并且想随时检查重复项,可以尝试以下方法:
IEnumerable<string> SearchAccessibleFilesNoDistinct(string root, List<string> files)
{
if(files == null)
files = new List<string>();
foreach (var file in Directory.EnumerateFiles(root))
{
string extension = Path.GetExtension(file);
if(!files.Containes(extension))
files.Add(extension);
}
foreach (var subDir in Directory.EnumerateDirectories(root))
{
try
{
SearchAccessibleFilesNoDistinct(subDir, files);
}
catch (UnauthorizedAccessException ex)
{
// ...
}
}
return files;
}
第一次呼叫看起来像这样:
var extensionsList = SearchAccessibleFilesNoDistinct("rootAddress",null);
您会看到我通过递归方法传递了文件列表,通过这种方法,我们在所有递归调用中都具有相同的文件列表,因此应该可以解决问题,请记住,在递归调用中无需获取返回的列表因为我们已经有相同的列表,但是最后我们可以使用返回的列表进行进一步使用。希望能有所帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句