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

Posted

技术标签:

【中文标题】在 UWP 应用中获取计算机上任何文件的路径【英文标题】:Get path to any file on the computer in UWP app 【发布时间】:2018-10-20 03:53:15 【问题描述】:

我是第一次开发 UWP 应用。我一直使用 Windows Forms 和 WPF,但这些应用程序的潜在设计是华丽的,但问题是它们是一种沙盒,尤其是对于我当前的项目。基本上,我正在制作一个游戏启动器,您可以在其中添加游戏,程序会创建一个游戏列表。 (可以将它想象成适用于具有现代 Windows 10 Material 设计的一切的 Steam)。

现在,我几乎完成了所有事情,但只有两件事。首先,也是最重要的,是找到通往游戏的道路。我创建了一个文件选择器,我可以选择 .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);

【问题讨论】:

我以前也从未使用过 UWP,但我刚刚尝试了您的代码,file.Path 很好地返回了文件的完整路径。旁注:you should avoid using async void. 但是,我刚刚检查了the docs,它说:“不要依赖此属性来访问文件,因为某些文件可能没有文件系统路径。例如如果文件由 URI 支持,或者是使用文件选择器选择的,则不能保证该文件具有文件系统路径。” 但它们没有引用任何替代方法,因此我不知道。也许有 UWP 经验的人可以帮助你。祝你好运! 谢谢!是的,我不知道,它的行为很奇怪。 【参考方案1】:

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

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

    使用 Steam 启动非 Steam 游戏。您可以添加非 Steam 快捷方式,这会根据文件的路径创建一个 SteamID,以便您可以使用 URI 从 UWP 应用程序启动它。我找到了使用来自this board post 的 Steam URI 方案启动任何 exe 的算法,并点击该人的 Python 项目源代码的链接。

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

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

    考虑完全不使用 UWP。我相信您知道有一些库可以让 WPF 看起来更现代。

【讨论】:

我想我会选择助手选项。看起来这实际上是一个好主意,因为我可以拥有一个原生的现代设计,而后台处理是由我习惯的一种程序完成的。谢谢!!

以上是关于在 UWP 应用中获取计算机上任何文件的路径的主要内容,如果未能解决你的问题,请参考以下文章

动态加载spring xml配置

是否可以在PC的共享文件夹中使用SQLite数据库?

将不在我计算机上的图像上传到 Cloudinary

使用Jenkins进行的UWP单元测试

无需输入即可将数据从 Web 应用程序获取到客户端计算机上特定文件夹中的 XML 文件中的方法

获取 CPU、RAM 和 GPU 信息 - UWP 应用