2012-05-22 9 views
6

Estoy trabajando en una aplicación 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 eliminaron completamente del framework.WinRT: aplicación para enumerar archivos fuera de bibliotecas y carpetas conocidas

Estoy buscando un reemplazo para enumerar archivos en C# en una aplicación de estilo metro. He comprobado todas las muestras de enumeración proporcionados por la EM y todos ellos parecen sólo para enumerar las bibliotecas de Windows utilizando el KnownFolders clase, algo así como:

StorageFolder picturesFolder = KnownFolders.PicturesLibrary; 

y llamando a los GetFilesAsync() o GetFoldersAsync() métodos dependiendo de sus necesidades. Todo esto es oro si quisiera enumerar solo dentro de las imágenes o la biblioteca de música. Sin embargo, estoy buscando enumerar archivos en directorios que no están incluidos en una biblioteca.

¿Alguien sabe cómo esto es posible en WinRT ???

Respuesta

14

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

  1. acceso a almacenamiento local, específica para su aplicación
  2. acceso a un puñado de bien conocida ubicaciones de almacenamiento, o
  3. acceder a una ubicación específicamente otorgada.

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

+0

Ahh, esa es la página que estaba buscando. Pásame, +1 –

+1

En estos días, vivo y respiro en dev.windows.com y design.windows.com – Robaticus

+0

gracias, eso fue útil ... sin embargo, si me puedes ayudar con una cosa más ... sigo obtener excepciones de acceso denegado cuando trato de obtener DocumentsLibrary como una StorageFolder aunque lo he comprobado en la sección de capacidades del manifiesto de aplicaciones. ¿¿¿Algunas ideas??? Sin embargo, puedo acceder a MusicLibrary sin problemas –

10

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

Cuando se utiliza C# y VB, que está utilizando el marco .NET completa. Pero que han elegido para exponer un subconjunto más pequeño de la API para desarrolladores para empujar la nueva visión para Windows 8.

Y esta nueva visión incluye sistemas de seguridad de espacio aislado y/asíncrono de programación . Esta es la razón por la que no obtiene acceso directo al sistema de archivos o acceso al socket y por qué las API síncronas que estaba acostumbrado a consumir no están expuestas.

Ahora, nota que dije "expuesto" y no "desaparecido".

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

Esta división es similar a lo que se ha hecho en el pasado con Silverlight, donde fue expuesto no todas las API, y donde fue mscorlib derechos dado que su aplicación no tenía que asegurar que el sistema de seguridad .

Se podría pensar que se puede utilizar algún truco (haciendo referencia a la biblioteca de GAC lugar de la referencia del compilador o el uso de la reflexión para llegar a APIs privadas, o P/Invocación en Win32). Pero todos esos usos serán detectados por la aplicación de revisión de AppStore y no podrá publicar su aplicación a través de la tienda de Microsoft .

Todavía puede hacer cualquier hack feo que desee en su sistema. Simplemente no será posible publicar eso a través de la AppStore.

Así que probablemente no haya una manera 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 solo para que escanee mi disco duro y encuentre mi hoja de cálculo "budget.xls" que incluye mi información bancaria/de crédito.

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

0

Puede utilizar el método StorageFolder.GetFolderFromPathAsync para obtener una instancia StorageFolder de 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 sin embargo.

+1

Esto no funciona, quiero decir que obtiene el objeto, pero una vez que ingresa y accede a enumerar archivos, lanza una excepción de acceso denegado. Lo intenté en la ruta de escritorio completa y algunas otras rutas en las particiones que no son del sistema, todas dieron el mismo resultado –

0

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 acceso futuro (?) Para su posterior recuperación.

Cuestiones relacionadas