是否有本地(Windows API)方法列出特定类型的所有文件(例如视频文件),最好使用内置索引(Windows搜索使用的那个)?
为了澄清,我知道我可以使用基本的FS API递归列出所有文件并按扩展名过滤。我想要一个更快的方法,使用Windows搜索索引。
编程语言并不重要。如果你知道一个可能的解决方案,请用任何语言给我一个例子。
由于
答案 0 :(得分:2)
我发现本教程最有用,因为它解释了如何获取Windows Search API所需的DLL。
http://www.codeproject.com/Articles/21142/How-to-Use-Windows-Vista-Search-API-from-a-WPF-App
基本上,您需要安装Windows SDK。然后您可以运行命令行,如:
c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin>tlbimp "c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\SearchAPI.tlb"
生成所需的DLL。在项目中包含该DLL。然后,在c#中添加:
using SearchAPILib;
给你的代码。
从那里,我为搜索结果创建了一个简单的对象:
public class Result
{
public string Name { get; set; }
public string Ext { get; set; }
public string Path { get; set; }
public Result()
{
this.Name = string.Empty;
this.Ext = string.Empty;
this.Path = string.Empty;
}
}
并使用此代码进行查询。
public ActionResult Index(string q = "default")
{
var Results = new List<Result>();
var cManager = new CSearchManager();
ISearchQueryHelper cHelper = cManager.GetCatalog("SYSTEMINDEX").GetQueryHelper();
cHelper.QuerySelectColumns = "\"System.ItemNameDisplay\",\"System.FileExtension\",\"System.ItemFolderPathDisplay\"";
cHelper.QueryMaxResults = 50;
using (var cConnnection = new OleDbConnection(cHelper.ConnectionString))
{
cConnnection.Open();
using (var cmd = new OleDbCommand(cHelper.GenerateSQLFromUserQuery(q), cConnnection))
{
if (cConnnection.State == System.Data.ConnectionState.Open)
{
using (var reader = cmd.ExecuteReader())
{
Results.Clear();
while (!reader.IsClosed && reader.Read())
{
Results.Add(new Result() { Name = reader[0].ToString(), Ext = reader[1].ToString(), Path = reader[2].ToString() });
}
reader.Close();
}
}
}
cConnnection.Close();
}
ViewBag.Results = Results;
return View();
}
使用标准Razor视图输出:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<ul>
@{foreach(var item in ViewBag.Results){
<li>Name: <b>@item.Name</b><br />
Ext: <b>@item.Ext</b><br />
Path: <b>@item.Path</b>
</li>
}
}
</ul>
</div>
</body>
</html>
示例查询可能是:beer AND kind:pics
有关查询langauge的更多信息:http://msdn.microsoft.com/en-us/library/aa965711(v=vs.85).aspx
答案 1 :(得分:1)
正如其他人提到的那样使用Windows Search SDK。
从此页面下载示例DSearch:http://archive.msdn.microsoft.com/windowssearch 并传入类型:视频作为userQuery。