WinRT: aplicación para enumerar archivos fuera de bibliotecas y carpetas conocidas

Estoy trabajando en una aplicación de Metro que muestra el contenido de una carpeta determinada en un control ListView. MS decidió que los desarrolladores no necesitan la clase System.IO.Directory y la eliminó por completo del marco.

Estoy buscando un reemplazo para enumerar archivos en C # en una aplicación de estilo metro. He comprobado todos los ejemplos de enumeración proporcionados por MS y todos parecen enumerar solo las bibliotecas de Windows usando la clase KnownFolders , algo así como:

 StorageFolder picturesFolder = KnownFolders.PicturesLibrary; 

y llamar a los GetFilesAsync() o GetFoldersAsync() según sus necesidades. Estos son todos de oro si quisiera enumerar solo dentro de la biblioteca de imágenes o música. Sin embargo, estoy buscando enumerar archivos en directorios que no están incluidos en una biblioteca.

Alguien sabe como esto es posible en WinRT ???

Usted es, por diseño, extremadamente limitado en esta área para las aplicaciones de Metro. La idea es que a una aplicación de Metro solo se le da acceso a aquellas cosas para las que se puede confiar, por lo que puede:

  1. Accede al almacenamiento local, específico para tu aplicación.
  2. acceder a un puñado de lugares de almacenamiento conocidos, o
  3. acceder a una ubicación específicamente otorgada.

Visite http://msdn.microsoft.com/en-us/library/windows/apps/hh464959.aspx para tener una idea de a qué podrá acceder.

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

Cuando utiliza C # y VB, está utilizando el marco completo de .NET. Pero han optado por exponer un subconjunto más pequeño de la API a los desarrolladores para impulsar la nueva visión para Windows 8.

Y esta nueva visión incluye sistemas de seguridad / sandbox y progtwigción asíncrona. Esta es la razón por la que no obtiene acceso directo al sistema de archivos o acceso a sockets, y la razón por la cual las API síncronas que estaba acostumbrado a consumir no están expuestas.

Ahora, te das cuenta de que dije “expuesto” y no “ido”.

Lo que hicieron fue que solo expusieron al comstackdor un conjunto de API cuando apuntas al perfil de Metro. Por lo tanto, su aplicación no llamará accidentalmente a File.Create por ejemplo. Sin embargo, en tiempo de ejecución, el CLR cargará la biblioteca de clases completa, la misma que contiene File.Create, por lo que internamente, el CLR podría llamar algo como File.Create, solo usted no tendrá acceso a él.

Esta división es similar a lo que se hizo en el pasado con Silverlight, donde no se expusieron todas las API, y donde se otorgó a mscorlib los derechos que su aplicación no tenía para garantizar la seguridad del sistema.

Podría estar pensando que puede usar algún truco (hacer referencia a la biblioteca GAC ​​en lugar de la referencia del comstackdor o usar la reflexión para obtener API privadas o P / Invoking en Win32). Sin embargo, la aplicación de revisión AppStore detectará todos esos usos y no podrá publicar su aplicación a través de la tienda de Microsoft.

Aún puedes hacer lo que sea feo truco en tu sistema. Simplemente no será posible publicar eso a través de la AppStore.

Entonces, probablemente no haya una forma oficial, y si hay una forma no oficial, probablemente no será aceptada en la tienda de aplicaciones.

En general, esto tiene sentido: no quiero descargar una aplicación aparentemente legítima para que escanee mi disco duro y encuentre mi hoja de cálculo “budget.xls” que incluye mi información bancaria / crediticia.

EDITAR: es posible otorgar acceso temporal a archivos / carpetas seguros a través del selector de archivos de WinRT, pero tiene que ser invocado y elegido explícitamente por el usuario.

Puede usar el método StorageFolder.GetFolderFromPathAsync para obtener una instancia de StorageFolder desde una ruta.

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

Tenga en cuenta que es posible que no tenga permiso para hacer esto para todas las rutas en su máquina.

Situación similar. Quería acceder al archivo de marcadores de Chrome para analizar. Tuvo que usar FileOpenPicker inicialmente, pero el archivo que devuelve se puede “almacenar en caché” en la lista de accesos (?) Del futuro para su posterior recuperación.