我需要在给定位置搜索文件以获取指定内容。这些文件将通过网络应用程序(可能不一定在同一台服务器上)进行搜索,并且应该几乎实时更新。
在四处寻找扫描工具/代码后,我找到了这个答案,表明您可以通过编程方式连接到 Windows 的内置 Windows 搜索功能。
使用下面的代码(或多或少带有一些小调整的答案代码),我已经能够成功地在我的机器上完成这项工作:
public class WindowsSearchScanner
{
private const string Query = @"SELECT System.ItemName FROM SystemIndex WHERE scope ='file:{0}' and FREETEXT('{1}')";
public void DoSearch(string criteria, string path)
{
string connectionString = "Provider=Search.CollatorDSO;Extended Properties=\"Application=Windows\"";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
string query = string.Format(Query, path, criteria);
OleDbCommand command = new OleDbCommand(query, connection);
connection.Open();
List<string> result = new List<string>();
OleDbDataReader reader = command.ExecuteReader();
int count = 0;
while (reader.Read())
{
result.Add(reader.GetString(0));
Console.WriteLine(reader.GetString(0));
count++;
}
Console.WriteLine(count + " Records Found");
connection.Close();
}
}
}
我对此有几个疑问:
- 除了使用字符串查询之外,还有更好的(即更多的 .Net)访问 Windows 搜索的方法吗?
有没有办法对文本进行参数化?我尝试直接添加
OleDbParameters
到命令,但显然 CollatorDSO 不支持它。显然,我不希望事先清理数据——比如 SQL 注入,我可能会错过一些会导致问题的潜在途径string query = @"SELECT System.ItemName FROM SystemIndex WHERE scope ='file:' + @path and FREETEXT(@text)"; OleDbCommand command = new OleDbCommand(query, connection); command.Parameters.Add(new OleDbParameter("path", path)); command.Parameters.Add(new OleDbParameter("text", criteria)); connection.Open();
这可以从远程机器访问吗?
- 即使服务器没有安装相关软件,这也能工作 - 即如果目录包含一个 excel 文件,即使服务器没有安装办公室,它也会索引吗?