【问题标题】:WinRT: App to enumerate files outside libraries and known foldersWinRT:用于枚举库和已知文件夹之外的文件的应用程序
【发布时间】:2012-05-22 12:00:53
【问题描述】:

我正在开发一个 Metro 应用程序,该应用程序在 ListView 控件中显示给定文件夹的内容。 MS 决定开发人员不需要 System.IO.Directory 类并将其完全从框架中删除。

我正在寻找在 Metro 风格应用程序中枚举 C# 文件的替代品。我检查了 MS 提供的所有枚举示例,它们似乎都只使用 KnownFolders 类枚举 Windows 库,例如:

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;

并根据您的需要调用GetFilesAsync()GetFoldersAsync() 方法。如果我只想在图片或音乐库中列举这些都是黄金。但是,我希望枚举未包含在库中的目录上的文件。

任何人都知道这在 WinRT 中是如何实现的???

【问题讨论】:

    标签: c# windows-8 windows-runtime enumeration .net-4.5


    【解决方案1】:

    根据设计,您在 Metro 应用程序的这一领域极为有限。这个想法是,Metro 应用程序只能访问它受信任的内容,因此您可以:

    1. 访问本地存储,特定于您的应用程序
    2. 访问一些知名存储位置,或
    3. 访问专门授予的位置。

    查看http://msdn.microsoft.com/en-us/library/windows/apps/hh464959.aspx,了解您可以访问的内容。

    【讨论】:

    • 啊,这就是我要找的页面。打败我,+1
    • 这些天,我在 dev.windows.com 和 design.windows.com 上生活和呼吸
    • 谢谢,这很有帮助.. 但是,如果您能再帮我做一件事...当我尝试将 DocumentsLibrary 作为 StorageFolder 获取时,即使我已经检查过了,我仍然会收到拒绝访问的异常在应用程序清单功能部分。有任何想法吗???但是,我可以毫无问题地访问 MusicLibrary
    【解决方案2】:

    来自http://tirania.org/blog/archive/2011/Sep-15.html

    当您使用 C# 和 VB 时,您使用的是完整的 .NET 框架。但 他们选择向开发人员公开一小部分 API 推动 Windows 8 的新愿景。

    而这一新愿景包括安全/沙盒系统和异步 编程。这就是为什么您无法直接访问文件系统或 套接字访问以及您习惯使用同步 API 的原因 没有暴露。

    现在,你注意到我说的是“暴露”而不是“消失”。

    他们所做的是只向编译器公开了一组 API 当您定位 Metro 配置文件时。所以你的应用程序不会 例如,意外调用 File.Create。但在运行时,CLR 将加载完整的类库,即包含 File.Create,所以在内部,CLR 可以调用类似 File.Create,只有您无权访问它。

    这种拆分类似于过去所做的 Silverlight,并非所有 API 都被公开,而 mscorlib 所在的位置 给定您的应用程序不必确保系统的权利 安全。

    您可能认为可以使用一些技巧(参考 GAC 库而不是编译器引用或使用反射来获取 到私有 API,或 P/Invoking Win32)。但所有这些用途都会 被 AppStore 审查应用程序抓住,你将无法 通过 Microsoft 商店发布您的应用。

    你仍然可以在你的系统上做你喜欢的任何丑陋的黑客攻击。这只是 将无法通过 AppStore 发布。

    所以可能没有官方的方式,如果有非官方的方式,应用商店可能不会接受。

    总的来说,这是有道理的:我不想下载一个看似合法的应用程序,只是为了让它扫描我的硬盘并找到包含我的银行/信用信息的“budget.xls”电子表格。

    编辑:可以通过 WinRT 的文件选择器授予对安全文件/文件夹的临时访问权限,但必须由用户明确调用和选择。

    【讨论】:

      【解决方案3】:

      您可以使用StorageFolder.GetFolderFromPathAsync 方法从路径中获取StorageFolder 实例。

      StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(@"C:\...");
      

      请注意,您可能无权对计算机上的所有路径执行此操作。

      【讨论】:

      • 这不起作用,我的意思是你得到了这个对象,但是一旦你尝试访问它来枚举文件,它就会抛出一个拒绝访问异常。在完整的桌面路径和非系统分区上的一些其他路径上尝试过,都给出了相同的结果
      【解决方案4】:

      类似的情况。想要访问 chrome 书签文件进行解析。最初必须使用 FileOpenPicker,但它返回的文件可以“缓存”在 futureaccesslist(?) 中以供后续检索。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        • 1970-01-01
        • 2010-12-09
        相关资源
        最近更新 更多