У меня есть следующий код для поиска в индексе Windows определенных файлов. В результате я получаю список файлов с именем файла и путем. Проблема в том, что у меня немецкая система, и путь, который возвращает поиск, имеет немецкий формат. Например: в качестве пути я получаю «C:\Benutzer» вместо «C:\Users». Таким образом, путь не зависит от языка. Затем я хочу использовать путь, чтобы открыть проводник в том месте, которое я получил в результате поиска. Но когда я запускаю проводник с немецким путем в качестве аргумента, он всегда открывает папку «Документы». Итак, есть ли способ всегда получать английский путь из поиска:
Вот мой код:
var connection = new OleDbConnection(@"Provider=Search.CollatorDSO;Extended Properties = ""Application=Windows""");
try
{
connection.Open();
var query = $"SELECT TOP 5 System.ItemName, System.ItemPathDisplay FROM SystemIndex WHERE scope ='file:' AND System.ItemName LIKE '%{searchFile}%'";
var command = new OleDbCommand(query, connection);
var searchedFilesView = new SearchedFilesView();
content = searchedFilesView;
List<(string name, string path)> files = new List<(string name, string path)>();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
string fileName = reader["System.ItemName"].ToString();
string filePath = reader["System.ItemPathDisplay"].ToString();
files.Add((fileName, (filePath)));
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"An error occurred: {ex.Message}");
return false;
}
finally
{
connection.Close();
}





Чтобы решить проблему языково-зависимых путей в результатах поиска, вы можете использовать свойство System.ItemUrl вместо System.ItemPathDisplay. Свойство System.ItemUrl предоставляет URL-адрес, который должен быть независимым от языка и может использоваться для открытия местоположения файла в проводнике Windows.
Вот как вы можете изменить свой код для использования System.ItemUrl:
var connection = new OleDbConnection(@"Provider=Search.CollatorDSO;Extended Properties = ""Application=Windows""");
try
{
connection.Open();
var query = $"SELECT TOP 5 System.ItemName, System.ItemUrl FROM SystemIndex WHERE scope ='file:' AND System.ItemName LIKE '%{searchFile}%'";
var command = new OleDbCommand(query, connection);
var searchedFilesView = new SearchedFilesView();
content = searchedFilesView;
List<(string name, string url)> files = new List<(string name, string url)>();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
string fileName = reader["System.ItemName"].ToString();
string fileUrl = reader["System.ItemUrl"].ToString();
files.Add((fileName, fileUrl));
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"An error occurred: {ex.Message}");
return false;
}
finally
{
connection.Close();
}
Каждое свойство, в названии которого содержится термин «Отображение», локализовано.
System.ItemNameнет, и это настоящее имя файловой системы. Теоретически мы должны иметь возможность использоватьSystem.ParsingPath, но он не отображается таким образом, поэтому вы можете использоватьpathвместоSystem.ItemPathDisplay(он будет иметь формат URI, например: file://...). Другие сочетания клавиш:filename,write,access,create,attrib.