Я работаю над C # WPF проектом, который может искать файлы по указанным путям каталогов. Эти пути могут быть как на локальном, так и на удаленном компьютере, поэтому я должен решить его на обоих.
Сначала я попытался использовать запрос с локальным путем, но класс OleDbDataReader возвращается с нулевыми записями. Я уверен, что все настроил соответствующим образом, например, Параметры индексирования содержат правильный путь: - или в проводнике: - и Типы файлов содержат текстовый файл в списке:
Код для локального поиска:
CSearchManager manager = new CSearchManager();
CSearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
CSearchQueryHelper queryHelper = catalogManager.GetQueryHelper();
queryHelper.QuerySelectColumns = "System.ItemName,System.FileName,System.Author,System.ItemUrl,System.ItemType";
queryHelper.QueryWhereRestrictions = @"AND SCOPE='file:D:\testIndexing' AND System.FileName LIKE '*.txt'";
string userQuery = "SELECT System.FileName FROM SystemIndex WHERE SCOPE='file:D:\testIndexing' AND System.FileName LIKE '*.txt'";
string sqlQuery = queryHelper.GenerateSQLFromUserQuery(userQuery);
OleDbConnection conn = new OleDbConnection(queryHelper.ConnectionString);
conn.Open();
OleDbCommand command = new OleDbCommand(sqlQuery, conn);
using (OleDbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
Console.WriteLine(reader[0]);
}
}
conn.Close();
Позже я попытался подключиться к Windows Server. Путь к серверу правильный, потому что я могу просматривать файлы сервера через проводник - это соединение VPN. Параметры индексации также корректно настроены здесь. Но проблема в том, что я не могу использовать метод подключения, описанный выше, потому что метод GetCatalog не поддерживает удаленное подключение - поэтому я попробовал метод THIS . Я нашел пример, который можно увидеть ниже, но здесь я получил исключение:
System.UnauthorizedAccessException: 'Retrieving the COM class factory for remote component with CLSID {[CLSID]} from machine [SERVER NAME] failed due to the following error: 80070005 [SERVER NAME].'
Проблема в том, что я пытался добавить CLSID. Я понятия не имею, где я могу получить этот идентификатор, потому что я не нашел никакого конкретного решения для этого. Здесь мне нужна помощь, например, что такое CLSID в моем случае и как его получить?
Код для удаленного поиска:
Guid guid = new Guid("{[CLSID]}"); // this is what I don't know how to provide
Type managerType = Type.GetTypeFromCLSID(guid, "SERVER_NAME", true);
var comManager = Activator.CreateInstance(managerType);
CSearchManagerClass manager = (CSearchManagerClass)System.Runtime.InteropServices.Marshal.CreateWrapperOfType(comManager, typeof(CSearchManagerClass));
CSearchCatalogManager catalogManager = manager.GetCatalog("SERVER_NAME.SystemIndex");
CSearchQueryHelper queryHelper = catalogManager.GetQueryHelper();
queryHelper.QuerySelectColumns = "System.ItemName,System.FileName,System.Author,System.ItemUrl,System.ItemType";
queryHelper.QueryWhereRestrictions = @"AND SCOPE='file:\\SERVER_NAME\path\to\scope' AND System.FileName LIKE '*.txt'";
string userQuery = @"SELECT System.FileName FROM SystemIndex WHERE SCOPE='file:\\SERVER_NAME\path\to\scope' System.FileName LIKE '*.txt'";
string sqlQuery = queryHelper.GenerateSQLFromUserQuery(userQuery);
OleDbConnection conn = new OleDbConnection(queryHelper.ConnectionString);
conn.Open();
OleDbCommand command = new OleDbCommand(sqlQuery, conn);
using (OleDbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
Console.WriteLine(reader[0]);
}
}
conn.Close();