8

我正在开发一个应用程序,用户可以在本地计算机或网络上搜索文件或文件夹。我正在使用DirectoryInfo.GetDirecotories().

  1. 但我还想添加 Windows 7 用于搜索的功能,我相信使用索引。我还在 msdn 上看到了Windows Searching Service,但我不确定哪种方式最好:查询索引目录或使用搜索服务。有什么建议么?
  2. 我想知道是否有人可以在 C# 中给我一个搜索索引目录的小示例。

提前致谢!

4

1 回答 1

12

请参见以下示例:

static void Main(string[] args)
{
    var connection = new OleDbConnection(@"Provider=Search.CollatorDSO;Extended Properties=""Application=Windows""");

    // File name search (case insensitive), also searches sub directories
    var query1 = @"SELECT System.ItemName FROM SystemIndex " +
                @"WHERE scope ='file:C:/' AND System.ItemName LIKE '%Test%'";

    // File name search (case insensitive), does not search sub directories
    var query2 = @"SELECT System.ItemName FROM SystemIndex " +
                @"WHERE directory = 'file:C:/' AND System.ItemName LIKE '%Test%' ";

    // Folder name search (case insensitive)
    var query3 = @"SELECT System.ItemName FROM SystemIndex " +
                @"WHERE scope = 'file:C:/' AND System.ItemType = 'Directory' AND System.Itemname LIKE '%Test%' ";

    // Folder name search (case insensitive), does not search sub directories
    var query4 = @"SELECT System.ItemName FROM SystemIndex " +
                @"WHERE directory = 'file:C:/' AND System.ItemType = 'Directory' AND System.Itemname LIKE '%Test%' ";           

    connection.Open();

    var command = new OleDbCommand(query4, connection);

    using (var r = command.ExecuteReader())
    {
        while (r.Read())
        {
            Console.WriteLine(r[0]);
        }
    }

    connection.Close();

    Console.ReadKey();
}

它使用 OLE DB api 连接到索引器服务并使用类似 SQL 的语法来搜索SystemSystemIndex表中的对象。您有 4 个执行不同操作的示例查询。所有示例查询都将在c:\文件夹中搜索名称中包含的项目Test

您可以在本地或其他机器上搜索文件、文件夹、邮件和可能的其他媒体(取决于操作系统)。根据我的研究,不支持网络驱动器,因为它们无法被索引,但您可以连接到我认为在后台使用 RPC 的其他机器,这意味着您必须使用不同的 api(例如 System.网)。

请注意,要使所有这些工作,您的索引必须在目标机器上完全可操作(默认情况下)。该 api 对应于您在索引选项中指定的任何内容。这是有问题的屏幕:

索引选项

System可以在此处找到对象 的完整属性列表:属性系统参考。该对象包含诸如 URL、路径、名称、日期等内容。

可以在此处找到使用不同谓词(例如scope和)的更多有趣示例: Windows Vista 搜索语法。还有一个粗略的 MSDN 文档:SCOPE and DIRECTORY Predicatesdirectory

我建议你查看文档,因为你可以用这个 api做很多事情。

于 2015-12-17T17:04:32.350 回答