如何以编程方式使用 Windows 文件资源管理器执行搜索?

How can I programmatically use Windows File Explorer to perform a Search?

我们的网络上有一个文件夹,我们希望从我们的程序中搜索该文件夹,包括子文件夹。我们想要 return 名称包含 "String1" 或 "String2" 或 "StringN" 的文件列表。我们更愿意以编程方式打开资源管理器 window 并使用本机 windows 文件资源管理器查看与搜索结果匹配的所有文件。

这可能吗?怎么样?

谢谢!

您可以使用.ms-search file format来表示保存的搜索。如果您打开此文件格式,它将启动一个应用了搜索条件的文件资源管理器。

如果您已经打开了文件资源管理器 window 并应用了搜索,您可以使用功能区上的 'save search' 按钮保存它。

由于 Windows Explorer 随 OS 的每个版本而变化...我建议通过 .NET 进行搜索并将结果显示在表格的网格上。

使用 System.IO 命名空间。

System.IO.Directory.GetFiles(folderName) 将获取文件...

您将需要一个递归函数来首先枚举所有文件,然后递归每个子目录。

下面是一些代码,用于创建已保存的搜索 xml 文件 (file.search-ms),用于使用指定路径和搜索字符串按名称进行搜索:

/// <summary>
    /// Generates the XDocument needed to create a .search-ms file for the path and mask given where mask specifies name parameter.
    /// search string in Windows is name:~searchmask. Searchmask includes * at beginning and end to find string present anywhere in name
    /// 
    /// </summary>
    /// <param name="searchPath">absolute path eg C:\Pictures\</param>
    /// <param name="searchMask"> part of search string after name:~</param>
    /// <returns></returns>
    public XDocument GenerateSearchDocName(string searchPath, string searchMask)
    {
        //  "*[*2602_Australia_Australian Capital Territory_O'Connor*].*" - example searchMask

        string str = @"<?xml version=""1.0""?><persistedQuery version=""1.0""><viewInfo viewMode=""icons"" iconSize=""96"" stackIconSize=""0"" displayName=""Search Results in iPhoneSample"" autoListFlags=""0""><visibleColumns><column viewField=""System.ItemNameDisplay""/><column viewField=""System.ItemDate""/><column viewField=""System.Keywords""/><column viewField=""System.Size""/><column viewField=""System.Rating""/><column viewField=""System.ItemFolderPathDisplay""/></visibleColumns><sortList><sort viewField=""System.Search.Rank"" direction=""descending""/><sort viewField=""System.ItemDate"" direction=""descending""/><sort viewField=""System.ItemNameDisplay"" direction=""ascending""/></sortList></viewInfo><query><conditions><condition type=""leafCondition"" property=""System.ItemNameDisplay"" operator=""matches"" propertyType=""string"" ";

        str += @"value=" + searchMask ;
        str+= @" localeName=""en-US""><attributes><attribute attributeID=""{9554087B-CEB6-45AB-99FF-50E8428E860D}"" clsid=""{C64B9B66-E53D-4C56-B9AE-FEDE4EE95DB1}"" chs=""1"" sqro=""585"" timestamp_low=""3078723010"" timestamp_high=""30601338""><condition type=""leafCondition"" property=""System.ItemNameDisplay"" operator=""matches"" propertyType=""string"" ";

        str += @"value=" + searchMask;
        str+= @" localeName=""en-US""><attributes><attribute attributeID=""{9554087B-CEB6-45AB-99FF-50E8428E860D}"" clsid=""{C64B9B66-E53D-4C56-B9AE-FEDE4EE95DB1}"" chs=""1"" sqro=""585"" timestamp_low=""2194097220"" timestamp_high=""30601338""><condition type=""leafCondition"" property=""System.ItemNameDisplay"" operator=""matches"" propertyType=""string"" ";

        str += @"value=" + searchMask + " ";
        str+= @"valuetype=""System.StructuredQueryType.Blurb"" localeName=""en-US""><attributes><attribute attributeID=""{9554087B-CEB6-45AB-99FF-50E8428E860D}"" clsid=""{C64B9B66-E53D-4C56-B9AE-FEDE4EE95DB1}"" chs=""0"" ";

        str += @"parsedString=""name:~ &quot;" + searchMask.TrimStart('"').TrimEnd('"') + @"&quot;"" ";
        str+= @"localeName=""en-US"" timestamp_low=""2194097220"" timestamp_high=""30601338""/></attributes></condition></attribute></attributes></condition></attribute></attributes></condition></conditions><kindList><kind name=""item""/></kindList><scope>";

        str+=@"<include path="""+ searchPath +  @""" ";
        str+=@"attributes=""1887437183""/></scope></query></persistedQuery>";
        XDocument doc = XDocument.Parse(str);

        return doc;
    }

https://github.com/nvuono/ExplorerQuickSearch 中的示例代码仅使用按文件扩展名进行搜索,但展示了如何在临时文件夹中创建并执行保存的搜索。

更好的解决方案是为搜索生成 URL 并将其提供给 Internet Explorer,后者生成 Windows/File Explorer window 显示搜索结果。执行此操作的一些代码显示在

Create a saved search (.search-ms) from terms in Explorer search box