نقل قول نوشته شده توسط qasemf مشاهده تاپیک
ببینید چون بحث سرعت هم مطرح هست من اومدم به این روش عمل کردم و از parallel استفاده کردم واسه همین الان این شرطی که شما گفتین رو نمیتونم پیادش کنم


private void WalkDirectoryTree(DirectoryInfo dr, string searchname)

{

System.IO.FileInfo[] files = null;
System.IO.DirectoryInfo[] subDirs = null;
try
{
files = dr.GetFiles(searchname + ".*");
if (files != null)
{
if (InvokeRequired)
{
Invoke((MethodInvoker)delegate () {

foreach (FileInfo fi in dr.GetFiles(searchname + ".*")
.Where(f => !f.Attributes.HasFlag(FileAttributes.System))
.Where(s => !s.Attributes.HasFlag(FileAttributes.Hidden)))


{
flowLayoutPanel2.Controls.Clear();
listview_Control.Filelist.Items.Add(fi.Name);
flowLayoutPanel2.Controls.Add(listview_Control);

// allFiles.Add(fi);
}
});
}

subDirs = dr.GetDirectories();

Parallel.ForEach(subDirs, dwr => WalkDirectoryTree(dwr, searchname)


);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


}
شما شرط رو روی فایل گذاشتید، باید روی دایرکتوری قرار بدید
var subDirs = dr.GetDirectories()
.Where(f => !f.Attributes.HasFlag(FileAttributes.System))
.Where(s => !s.Attributes.HasFlag(FileAttributes.Hidden));