我们的网络上有一个文件夹,我们想从我们的程序中搜索,包括子文件夹。我们想要返回名称包含“String1”或“String2”或“StringN”的文件列表。我们希望以编程方式打开资源管理器窗口并使用本机 Windows 文件资源管理器查看与搜索结果匹配的所有文件。
这可能吗?如何?
谢谢!
我们的网络上有一个文件夹,我们想从我们的程序中搜索,包括子文件夹。我们想要返回名称包含“String1”或“String2”或“StringN”的文件列表。我们希望以编程方式打开资源管理器窗口并使用本机 Windows 文件资源管理器查看与搜索结果匹配的所有文件。
这可能吗?如何?
谢谢!
您可以使用.ms-search 文件格式来表示已保存的搜索。如果您打开此文件格式,它将启动应用了搜索条件的文件资源管理器。
如果您已经打开了应用了搜索的文件资源管理器窗口,则可以使用功能区上的“保存搜索”按钮保存该窗口。
由于 Windows 资源管理器随操作系统的每个版本而变化……我建议通过 .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:~ "" + searchMask.TrimStart('"').TrimEnd('"') + @"""" ";
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,Internet Explorer 会生成一个显示搜索结果的 Windows/文件资源管理器窗口。执行此操作的一些代码显示在