2012-06-25 6 views
8

¿Alguien sabe cómo obtener una lista de archivos para una carpeta determinada de SkyDrive? Actualmente estoy usando el siguiente fragmento para tratar de obtener los archivos de la carpeta de SkyDrive raíz:Obtener la lista de archivos de la carpeta SkyDrive (Windows Phone)

var client = new LiveConnectClient(e.Session); 

client.GetCompleted += (obj, arg) => 
    { 
     ... 
    } 

client.GetAsync("me/skydrive"); 

pero todo lo que vuelve es un diccionario de resultados que contiene una gran cantidad de información, pero no hay una lista de nombres de archivos!

Respuesta

3

Después de conseguir desesperado y hacer la pregunta here

resulta que el de obtener una lista de los archivos de la carpeta de SkyDrive raíz es necesario utilizar la cadena mágica me/SkyDrive/archivos en lugar de sólo mí o me/skydrive

0

¿Están sus archivos directamente debajo de "me/skydrive"? De lo contrario, debe llamarlo al client.GetAsync("me/skydrive/YOURFOLDER");

Luego, da los datos de su salida en un diccionario de resultados con la clave data. y se puede recuperar utilizando el siguiente fragmento de código en el controlador completedEvent:

 var data = (List<object>)e.Result["data"]; 
     foreach (IDictionary<string, object> content in data) 
     {     
      var skyContent = new SkyDriveContent(); 
      skyContent.Name = (string)content["name"]; 
      ContentList.Add(skyContent); // where ContentList is :  List<SkyDriveContent> ContentList = new List<SkyDriveContent>(); in your class     
     } 

Espero que esto ayude.

+0

no funciona: recibo una KeyNotFoundException para e.Result [ "datos"] – Calanus

+0

Sí, estoy pidiendo a la lista de archivos en la raíz SkyDrive carpeta es decir, yo/skydrive – Calanus

+0

puede iterar a través de su diccionario y ver las claves que contiene. – MBen

10

Según OneDrive core concepts (anteriormente SkyDrive) tiene dos opciones para listar archivos, ya sea en el directorio superior o en una carpeta específica. Como has descubierto, puede listar los archivos principales usando

liveClient.GetAsync("me/skydrive/files"); 

y para una carpeta específica se utiliza folderId + "/files", por ejemplo

liveClient.GetAsync(folder.Id + "/files"); 

en caso GetCompleted puede listar todos los archivos de la clave de datos

private void onFilesInformationDownloaded(object sender, 
              LiveOperationCompletedEventArgs e) { 
    if (e.Result == null) { 
     // check e.Error for reason why it failed 
     return; 
    } 
    List<object> data = (List<object>)e.Result["data"]; 
    foreach (IDictionary<string, object> content in data) { 
     string type = (string)content["type"]; 
     if (type == "folder") { 
      // do something with folders? 
     } 
     string filename = (string)content["name"]; 
     string fileId = (string)content["id"]; 
     // use fileId to download a file or list files in a folder 

     // there's a few more details available in content.Keys 
     // such as created_time and updated_time for those interested 
    } 
} 
3

Es realmente malo que MS no documente bien la API de contenido en vivo.

  1. Para obtener contenido de la carpeta raíz usan URI: https://apis.live.net/v5.0/me/skydrive/files?access_token= "+ accessToken
  2. Para cualquier otro contenido de la carpeta usar URI: https://apis.live.net/v5.0/folder.4ab680998d14f4e7.4AB680998D14F4E7!110/files?access_token=" + accessToken

Dónde folder.4ab680998d14f4e7.4AB680998D14F4E7!110 es la carpeta de destino que desea listar .

Java ejemplo de código:

public void listRootFolder(String accessToken) { 
    String folderId = "folder.4ab680998d14f4e7.4AB680998D14F4E7!110/files"; 
    String url = "https://apis.live.net/v5.0/" + folderId + "?access_token=" + accessToken; 
    HttpMethod method = new GetMethod(url); 
    HttpClient client = new HttpClient(); 
    try { 
     int returnCode = client.executeMethod(method); 
     System.out.println("Return code " + returnCode); 
     System.out.println(method.getResponseBodyAsString()); 
    } catch (HttpException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Debe formatear su código. Ahora es ilegible. – kazanaki

Cuestiones relacionadas