在C#中以编程方式搜索文件的最快方法是什么。我知道文件的相对位置,让我们说"abcd\efgh\test.txt".
我也知道这个文件在E:\ drive
上。 “abcd”是E:\ drive中某个目录的子目录。
由于
答案 0 :(得分:2)
由于您知道要搜索的根目录以及文件名的字符串模式,因此可以使用根目录创建DirectoryInfo:
DirectoryInfo dir = new DirectoryInfo(@"E:\");
然后拨打GetFiles()
以获取所有匹配项。传递SearchOption.AllDirectories
将确保搜索是递归的。
List<FileInfo> matches =
new List<FileInfo>(dir.GetFiles(partialFilename,
SearchOption.AllDirectories));
或者如果您知道部分路径(而不是文件名):
List<DirectoryInfo> matches =
new List<DirectoryInfo>(dir.GetDirectories(partialDirectoryName,
SearchOption.AllDirectories));
然后您可以从那里导航到该文件。
答案 1 :(得分:0)
因此,如果我理解正确,您知道路径将是以下形式:
"E:\\" + something + "\\abcd\\efgh\\test.txt"
如果something
只有1级深度,那么只需获取E:上的所有目录,然后尝试在每个子目录上打开一个文件。
如果something
深度超过1级,则进行递归调用以获取目录,直至找到abcd
。
答案 2 :(得分:0)
最快的方式可能是使用FindFirstFile
等api,但我认为你可以用Directory.GetDirectories
(找到合适的子目标)来快速(并且更容易)做到这一点然后Directory.GetFiles
找到实际文件。
答案 3 :(得分:0)
只需使用File.Exists方法并遍历所有可能的文件名。也许是这样的(未经测试):
string SearchInFolder(string root) {
if (File.Exists(Path.Append(root, "\\abcd\\efgh\\test.txt")) return Path.Append(root, "\\abcd\\efgh\\test.txt");
foreach(var folder in Directory.GetDirectories(root)) {
var fullFile = Path.Append(folder, "\\abcd\\efgh\\test.txt");
if (File.Exists(fullFile)) {
// Found it !!!!
return fullFile;
} else {
var result = SearchInFolder(folder);
if (result != null) return result;
}
}
return null;
}
但是这会搜索模式的整个E:\驱动器,也搜索子文件夹。
答案 4 :(得分:0)
我认为该算法将从e:\开始并读取所有目录。如果其中一个是\ abcd \,请立即检查路径和文件的其余部分,例如efgh \ test.txt。
如果e:\没有\ abcd \,那么你需要遍历每个子目录并进行相同的检查。 \ abcd \存在吗?是的,检查efgh \ text.txt。没有?遍历子目录。
如果你需要绝对最快,当你找不到\ abcd \,并且你有你的子目录列表,你现在必须去检查,你可以引入一定程度的线程。但这可能会很快变得毛茸茸。