我想查找位于TestName.lol
内的名称为TestRoot\TestSubFoler\Test\
的系统中的所有文件。
即。如果磁盘 C 和 D 都有TestRoot\TestSubFoler\Test\TestName.lol
,那么我想获得2个文件。
我考虑过不同的方法:
从C:\
和D:\
开始,然后递归搜索TestRoot
。然后对所有发现的事件执行相同的操作,而不是C:\
和D:\
。等等。
递归搜索TestName.lol
的所有文件夹。然后过滤掉位于“错误”文件夹中的文件。 (我相信在我的情况下,这会更快,因为这些文件的估计数量不大:1-10)
???我相信可以有更好的方法(更优雅或更好的性能)。无论如何,如果您认为我的解决方案没问题,请确认一下。
感谢。
编辑: Search file in directory using complex pattern一个类似的问题。
答案 0 :(得分:1)
查看Directory.GetFiles方法。那应该做你想要的。
实际上,this overload可能就是你需要的那个。
或者,你可以打电话给Directory.EnumeratFiles,它会为你做递归。
您的选择#2可能是要走的路。
确实没有一种特别有效的方法可以做到这一点。你可以通过直接调用Windows FindFirst
和FindNext
API函数来加快速度,但除非你这么做,否则它真的不值得。
答案 1 :(得分:1)
我个人觉得很难避免递归。因为文件系统没有索引。 Google桌面或Microsoft桌面搜索索引所有文件。如果你查询,你会很快得到答案。
我们的选择是.net框架为你做递归或你自己做。
其他选项是Linq - 我猜.net框架将执行递归。但它会更清洁
<强> LINQ的强>
http://msdn.microsoft.com/en-us/library/bb882649.aspx
// Take a snapshot of the file system.
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);
// This method assumes that the application has discovery permissions
// for all folders under the specified path.
IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);
string searchTerm = @"Visual Studio";
// Search the contents of each file.
// A regular expression created with the RegEx class
// could be used instead of the Contains method.
// queryMatchingFiles is an IEnumerable<string>.
var queryMatchingFiles =
from file in fileList
where file.Extension == ".htm"
let fileText = GetFileText(file.FullName)
where fileText.Contains(searchTerm)
select file.FullName;
// Execute the query.
Console.WriteLine("The term \"{0}\" was found in:", searchTerm);
foreach (string filename in queryMatchingFiles)
{
Console.WriteLine(filename);
}
.net code
foreach (FileInfo fi in directory.GetFiles())
{
// Console.WriteLine(@"Found file: [{0}] in directory: [{1}]", fi.Name, directory.FullName);
}
foreach (DirectoryInfo diSourceSubDir in directory.GetDirectories())
{
// Console.WriteLine(@"Sub Folder {0} found.", diSourceSubDir.FullName);
}