从Windows 8应用程序中在Windows资源管理器中打开文件?

8
我想编写一个函数,它可以简单地最小化我的Windows 8沉浸式应用程序,并在资源管理器中打开一个文件 - 最好是如果该文件位于多个文件的文件夹中,则高亮显示该文件。
 public async void OpenFile( string filePath)
 {
     StorageFile File = await StorageFile.GetFileFromApplicationUriAsync
                              (new Uri(filePath, UriKind.RelativeOrAbsolute)); ;

     if (File != null)
     {
         await Launcher.LaunchUriAsync(new Uri(File.Path));
     }
 }

这段代码给我返回了一个权限错误。有什么想法吗?

你读过关于文件访问和权限的这篇文章了吗?http://msdn.microsoft.com/en-us/library/windows/apps/hh967755.aspx - Zack
2
技术上讲,可以编写一个协议处理程序,然后启动资源管理器。问题是您无法通过商店发布它,因此对商店客户没有任何用处。放弃这个想法,你做不到。 - Hans Passant
@HansPassant 如果可以做到,我想要做!我想象如果有一种通用的方法来做这件事,那么它将对许多内部Windows 8应用程序非常有用,即使它们无法进入商店 :) - Simon Kiely
@Simon Hans是正确的,你无法在发布到Windows商店的应用程序中完成这个任务。你可以使用协议处理程序路线,在侧载的LOB应用程序中使其工作,但是与侧载相关的成本可能会超出你的承受范围。更多详细信息可以在此处找到:http://technet.microsoft.com/en-us/library/hh852635.aspx#SideloadingRequirements - Jon
3个回答

7
据我回忆,微软不会允许这样做。应用程序应该被设计成在沙箱中运行,并具有受限的权限。
默认情况下,Windows Store 应用程序可以访问某些文件系统位置,如应用程序安装目录、应用程序数据位置和下载文件夹。应用程序还可以通过文件选择器或声明功能来访问其他位置。
我尝试过协议处理程序方法,但被拒绝了两次 :D即使你找到一种方法来做到这一点并且仍然发布,这并不意味着微软不会改变主意并将您的应用程序从商店中删除。
就像 Hans Passant 所说的那样:
放弃这个想法,你不能让它起作用。

说实话,我并不介意它不能被接受,这纯粹是从我的角度来看的一个内部应用程序 - 所以它不会在Windows 8商店上列出。顺便提一下,你提到你只能访问某些文件位置 - 这是铁板钉钉的吗?没有办法访问除KnownFolder位置对象之外的任何文件夹的内容吗?那真是太痛苦了... - Simon Kiely
你提到你只能访问特定的文件位置 - 这是固定的吗?恐怕是的。如果你不介意不在 MS 商店中列出,那么协议处理程序方法是最好的选择。但这将意味着你将不得不交付应用程序更新,并且所有用户都需要拥有 MS 开发者账户(允许他们安装非商店应用程序)。PS:我假设我们正在谈论 Metro 应用程序(Win RT)。 - codingPear

5
这是你计划中方法的核心问题。在Windows Store生态系统中,没有“内部应用程序”的概念。唯一可能在其他机器上运行商店应用程序的方式是通过获取只能从商店获得的许可证密钥。
当你在开发开发机上的商店应用程序时,很容易忽略这一点。看起来似乎不需要许可证密钥才能运行和调试应用程序。但实际上确实有一个,当Visual Studio每个月向你提醒重新获取开发人员许可证密钥时,你就可以获得它。这是一个临时密钥,仅有效期为一个月,并且纯粹旨在给你足够的时间使你的应用程序稳定运行。没有任何机制可以将该密钥转移到另一台计算机或使其(以及程序)在一个月的过期之后继续存在。
当然,你仍然可以将内部应用程序发布到商店中。但是,您将像任何其他商店应用程序一样经过适当性和稳定性的审核程序。不仅是WACK执行的机械测试,还有两个人会在发布应用程序之前测试您的应用程序。如果您尝试绕过沙箱限制,包括协议处理程序黑客等操作,他们将毫不犹豫地拒绝您的应用程序。
一旦获得批准,任何Windows 8用户都可以下载该应用程序。这包括对您内部公司机密和实践感兴趣的黑客。非常方便,他也不必换下睡衣。
可预见的未来,典型的业务应用程序仍然是桌面应用程序。
此答案需要更新,现在有一种从专用服务器发布应用程序的机制。这被称为侧载。该应用程序仍然需要证书,并且成本巨大,但可以从由私人公司控制的私人服务器部署,而不是从Microsoft Store服务器部署。
概述在此处提供。

非常感谢您的回复。当然,您是完全正确的。到目前为止,我对Windows 8应用程序的经验非常令人沮丧。无法访问文件夹、数据库或执行简单操作等问题使得应用商店在我看来几乎不值得开发。我正在为我的公司进行这个应用程序的概念验证,以便在开发更多应用程序之前进行测试...但是,此时API过于受限制和封闭了 :( - Simon Kiely
1
@Hans 这并不完全正确。Windows 8确实支持在Server 2012、企业版、专业版和RT版本上侧载LOB应用程序。更多详情请参见此处 - Jon
你可以在Windows 8上侧载应用程序。但这需要你获得一个侧载密钥,价格为3000美元,可用于最多100个平板电脑。 - Rafał Saltarski
哎呀,我没注意的时候数字的价格涨了不少。 - Hans Passant
@RafałSaltarski,你能提供相关的来源/证明吗?根据我所找到的(http://technet.microsoft.com/en-us/windows/jj874388.aspx)和(http://www.microsoft.com/licensing/existing-customers/product-activation-results.aspx?Product=side),这并不是事实。如果机器已经加入域,就不需要侧载密钥。如果它们没有加入域,可以使用临时密钥(我个人使用过),或者通过批量许可证获得相对便宜的密钥。 - Robert MacLean

0

这个问题有一个特定的API,但似乎没有人知道:

var success = await Windows.System.Launcher.LaunchFolderAsync(KnownFolders.DocumentsLibrary);

更高级的这个API形式带有选项:

FolderLauncherOptions options = new FolderLauncherOptions();
options.ItemsToSelect.Add(file1);
bool success = await Windows.System.Launcher.LaunchFolderAsync(folder, options);

您还可以使用options.DesiredRemainingView设置所需的视图。

https://msdn.microsoft.com/en-us/library/windows/apps/dn889617.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接