我有以下代码来搜索 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();
}