【问题标题】:Enumerating files of specific type in Windows在 Windows 中枚举特定类型的文件
【发布时间】:2013-10-09 13:05:33
【问题描述】:

是否有一种本地 (Windows API) 方法来列出特定类型的所有文件(例如视频文件),最好使用内置索引(Windows 搜索使用的那个)?

澄清一下,我知道我可以使用基本的 FS API 递归地列出所有文件并按扩展名过滤。我想要一个更快的方法,它使用 Windows 搜索索引。

编程语言无关紧要。如果您知道可能的解决方案,请给我一个任何语言的示例。

谢谢

【问题讨论】:

标签: c# c++ .net windows winapi


【解决方案1】:

我发现本教程最有用,因为它解释了如何获取 Windows 搜索 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

更多查询语言信息:http://msdn.microsoft.com/en-us/library/aa965711(v=vs.85).aspx

【讨论】:

  • Windows 搜索索引新文件(例如刚从相机上传的文件)需要多长时间?
【解决方案2】:

正如其他人所提到的,使用 Windows Search SDK。

从此页面下载示例 DSearch:http://archive.msdn.microsoft.com/windowssearch 并传入 type:video 作为 userQuery。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多