6

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

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

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;

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

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

4

4 回答 4

14

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

  1. 访问本地存储,特定于您的应用程序
  2. 访问少数著名的存储位置,或
  3. 访问特定授予的位置。

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

于 2012-05-22T12:10:46.260 回答
10

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

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

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

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

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

这种拆分类似于过去使用 Silverlight 所做的事情,不是每个 API 都被公开,并且 mscorlib 被授予您的应用程序不必确保系统安全的权利。

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

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

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

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

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

于 2012-05-22T12:06:48.600 回答
0

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

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

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

于 2012-05-22T12:07:30.990 回答
0

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

于 2015-10-16T22:01:00.717 回答