C# 在UWP应用程序中获取计算机上任何文件的路径

C# 在UWP应用程序中获取计算机上任何文件的路径,c#,.net,uwp,storagefile,C#,.net,Uwp,Storagefile,我是第一次开发UWP应用程序。我总是使用Windows窗体和WPF,但这些应用程序的潜在设计非常出色,但问题是它们有点像沙箱,特别是对于我当前的项目。基本上,我正在制作一个游戏启动器,在那里你可以添加你的游戏,程序会创建一个游戏列表。(用现代Windows 10材质设计,可以把它想象成一种适用于一切事物的蒸汽) 现在,我几乎做了所有的事情,但有两件事。首先,也是最重要的,是找到通往游戏的道路。我创建了一个文件选择器,我可以拾取.exe文件,我可以获取它们的名称,但是file.Path属性不起作用

我是第一次开发UWP应用程序。我总是使用Windows窗体和WPF,但这些应用程序的潜在设计非常出色,但问题是它们有点像沙箱,特别是对于我当前的项目。基本上,我正在制作一个游戏启动器,在那里你可以添加你的游戏,程序会创建一个游戏列表。(用现代Windows 10材质设计,可以把它想象成一种适用于一切事物的蒸汽)

现在,我几乎做了所有的事情,但有两件事。首先,也是最重要的,是找到通往游戏的道路。我创建了一个文件选择器,我可以拾取.exe文件,我可以获取它们的名称,但是
file.Path
属性不起作用,它返回一个空路径。我原以为这可能是因为UWP的沙盒设计,但我深陷其中,我真的不想放弃它

第二个问题是启动这些文件。我使用Steam的特定URI在Steam游戏上实现了这一点。("steam://rungameid/xxxxxx“其中xxxxxx是游戏id),但如果我只是将路径作为URI,则它不起作用

你觉得怎么样?有什么解决办法吗?让我向您展示一些相关代码:

public async void SelectEXE()
{
    var picker = new Windows.Storage.Pickers.FileOpenPicker
    {
        ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail,
        SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary
    };
    picker.FileTypeFilter.Add(".exe");
    Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
    if (file != null)
    {
        stuffWrite[0] = file.Name;
        stuffWrite[1] = file.Path;
        count++;
        WriteCount();
        WriteItem(count, string.Join(",", stuffWrite));
        UpdateList();
    }
}

async void LaunchGame(string uriToLaunch)
{
    Uri uri = new Uri(uriToLaunch);
    games_list.Items.Add(uriToLaunch);
    uri = new Uri("steam://rungameid/730"); //replace with actual path
    await Windows.System.Launcher.LaunchUriAsync(uri);
}

正如Ahmed指出的那样,沙盒限制使得从该属性获取路径无法可靠地工作

至于启动,您不能直接从UWP应用程序启动exe文件。这根本不可能,因为设计明确限制了它这样做。您的问题的一些变通解决方案:

  • 使用Steam启动非Steam游戏。您可以添加非Steam快捷方式,这将基于文件的路径创建一个SteamID,以便您可以使用URI从UWP应用程序启动它。我找到了使用Steam URI方案启动任何exe的算法,并通过链接找到了此人的Python项目源代码

  • 创建一个帮助程序Win32应用程序,用于为您启动。在我的应用套件中,我使用WebSocket在UWP和Win32之间进行通信。还有一些新的解决方案可以将Win32应用程序集成到UWP中,如桌面网桥和完全信任Win32

  • 使用第三方脚本工具,如AutoHotkey。让您的UWP应用程序生成脚本字符串以启动游戏,并使用默认启动脚本语言的扩展名保存文本文件。然后,您可以使用Launcher类启动该文件,脚本应用程序将默认打开该文件,然后启动游戏。如果您这样做,我怀疑Windows应用商店是否会接受您的应用

  • 考虑根本不使用UWP。有一些库可以让WPF看起来更现代,我相信你也知道


  • 我以前也从未使用过UWP,但我只是尝试了一下您的代码和
    文件。Path
    很好地返回了文件的完整路径。旁注:。但是,我刚刚检查了一下,它说:“不要依赖此属性访问文件,因为某些文件可能没有文件系统路径。例如,如果文件由URI支持,或者是使用文件选择器拾取的,则不保证该文件有文件系统路径。”但它们没有提及任何替代方法,因此我不确定。或许有UWP经验的人可以帮你。祝你好运谢谢是的,我不知道,这很奇怪。我想我会选择帮助者。这似乎是一个好主意,因为我可以有一个本地的现代设计,而后台处理是由一种我习惯的程序完成的。非常感谢。