我要求在给定位置搜索指定内容的文件。这些文件将通过网络应用程序(可能不一定在同一台服务器上)进行搜索,并且应该近乎实时更新。
在浏览了扫描工具/代码之后,我点击了this回答,表明您可以通过编程方式挂钩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();
}
}
}
我对此有几个疑问:
有没有办法对文本进行参数化?我试着直接向命令添加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();
可以从远程计算机访问吗?
答案 0 :(得分:2)
for 3),4)msdn Using SQL and AQS Approaches to Query the Index 1)您可以尝试通过导入不安全添加Windows功能。 对于2)看起来很老式,但我想这种方法没有其他选择
答案 1 :(得分:0)
您可以去老派并在Process / ProcessStartInfo中使用FindStr。
Findstr(命令行工具)内置于您的服务器中,并且能够访问您模拟的用户可以访问的任何位置。
我在一个小的单页实现中尝试了这个,我能够读取/扫描本地驱动器上的文件以及UNC路径。
这可能是您的选择。输出是文本。