查找系统中位于定义的文件夹层次结构中的所有文件
本文关键字:文件夹 层次结构 文件 定义 系统 于定义 查找 | 更新日期: 2023-09-27 18:07:57
我想找到系统中名称为TestName.lol
的所有文件,位于TestRoot'TestSubFoler'Test'
内。
。如果在磁盘C和D上都有TestRoot'TestSubFoler'Test'TestName.lol
,那么我想获得2个文件。
我考虑了不同的方法来做到这一点:
-
从
C:'
和D:'
开始,然后递归搜索TestRoot
。然后对所有发现的事件执行相同的操作,而不是C:'
和D:'
。 -
递归搜索所有文件夹中的
TestName.lol
。然后过滤掉那些位于"错误"文件夹的文件。(我相信在我的情况下,这将更快,因为这样的文件的估计数量并不大:1-10) -
? ?我相信会有更好的方法(更优雅或性能更好)。无论如何,如果你认为我的解决方案是好的,请确认。
谢谢。
编辑:
我个人觉得很难避免递归。因为文件系统没有被索引。谷歌桌面或微软桌面搜索索引所有文件。在那里,如果你查询,你会很快得到答案。
我们的选择是。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代码
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);
}
看一下目录。getfile方法。这应该是你想要的。
实际上,这个重载可能是您需要的。
或者,您可以调用Directory。EnumeratFiles,它将为您执行递归。
你的选择#2可能是正确的。
确实没有特别有效的方法来做到这一点。你可以通过直接调用Windows FindFirst
和FindNext
API函数来加快速度,但除非你经常这样做,否则真的不值得这么做。