Windows 搜索 API 的路径语言错误

问题描述 投票:0回答:1

我有以下代码来搜索 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();
}
c# windows search winui-3
1个回答
0
投票

要解决搜索结果中与语言相关的路径问题,您可以考虑使用

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();
}

© www.soinside.com 2019 - 2024. All rights reserved.