Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Gestire cartelle di SkyDrive in Windows Phone con Visual Basic

In un precedente post abbiamo visto come interagire con SkyDrive in applicazioni per Windows Phone 8, scrivendo codice Viisual Basic. In quel post abbiamo imparato a caricare e scaricare file nella cartella radice di SkyDrive.

In questo post facciamo un ulteriore e più utile passaggio, ossia la creazione di una cartella per la memorizzazione dei nostri file (e il successivo recupero). E' importante che leggiate il post menzionato prima di andare avanti a leggere questo.

La classe LiveConnectClient espone un metodo GetAsync che permette di ottenere varie informazioni ed elenchi dal nostro SkyDrive, incluso l'elenco delle cartelle. Per fare questo è necessario filtrare l'elenco dei risultati ottenuti proprio affinché vengano estratte solo le cartelle. Il resto degli oggetti usati è stato già visto nel precedente post, quindi di seguito c'è il codice corredato da commenti utili:

Dim client As LiveConnectClient
Dim fileID As String
Dim skyDriveFolderName As String = "NomeCartella"
Dim skyDriveFolderID As String
 
Private Async Sub BackupButton_Click(sender As Object, e As RoutedEventArgs) Handles BackupButton.Click
 
    'ottengo l'elenco delle cartelle
    Dim result = Await client.GetAsync("me/skydrive/files?filter=folders")
    'converto l'elenco in un IDictionary
    Dim folderData As IDictionary(Of StringObject) = TryCast(result.Result, IDictionary(Of StringObject))
    'ottengo la lista epurata
    Dim folders As List(Of Object) = DirectCast(folderData("data"), List(Of Object))
 
    'ciclo la lista per vedere se già esiste
    'una cartella col nome di mio interesse
    For Each item As Object In folders
        Dim folder As IDictionary(Of StringObject) = TryCast(item, IDictionary(Of StringObject))
        If folder("name").ToString() = skyDriveFolderName Then
            'se già esiste, ne memorizzo l'id
            skyDriveFolderID = folder("id").ToString()
        End If
    Next
 
    'se il risultato è vuoto, la cartella non esiste
    If skyDriveFolderID = String.Empty Then
        'quindi creo un nuovo oggetto che la rappresenti
        Dim skyDriveFolderData As New Dictionary(Of StringObject)()
        'e assegno il nome cartella alla parte "Key" che rappresenta il nome oggetto
        skyDriveFolderData.Add("name", skyDriveFolderName)
 
        'Invoco un'operazione http POST per crearla
        Dim postCompleted = Await client.PostAsync("me/skydrive", skyDriveFolderData)
        'una volta creata, ne ottengo il riferimento
        Dim folder As IDictionary(Of StringObject) = CType(postCompleted.Result, IDictionary(Of StringObject))
        'e ne memorizzo l'ID per successivi usi
        skyDriveFolderID = folder("id").ToString()
 
        Await UploadFile()
    Else
        Await UploadFile()
    End If
 
End Sub
 
'Vedi post precedente su dettagli upload file
Private Async Function UploadFile() As System.Threading.Tasks.Task
    Using storage = IsolatedStorageFile.GetUserStoreForApplication()
        Dim stream = storage.OpenFile("MioFile.txt", FileMode.Open)
 
        Dim result = Await client.UploadAsync(Me.skyDriveFolderID, "MioFile.bak", stream, OverwriteOption.Overwrite)
        If result.Result IsNot Nothing Then
            Me.fileID = result.Result("id").ToString
            Exit Function
        End If
    End Using
End Function

Sostanzialmente la logica rimane la stessa che avevamo già visto per i file, con l'unica differenza che dapprima va ottenuto l'elenco delle cartelle. Ricordiamo che GetAsync recupera l'elenco di tutto, per tale motivo è necessario applicare un filtro. Per recuperare un file da una cartella, dapprima si verifica che la stessa esista, in caso positivo si ottiene l'elenco degli elementi ad essa associati e si verifica che esista un file con l'id specificato, che poi viene scaricato:

Private Async Sub RestoreButton_Click(sender As Object, e As RoutedEventArgs) Handles RestoreButton.Click
    'Ottengo l'elenco delle cartelle
    Dim result = Await client.GetAsync("me/skydrive/files?filter=folders")
 
    'converto l'elenco in IDictionary
    Dim folderData As IDictionary(Of StringObject) = TryCast(result.Result, IDictionary(Of StringObject))
    'ottengo la lista epurata
    Dim folders As List(Of Object) = DirectCast(folderData("data"), List(Of Object))
 
    'ciclo la lista per vedere se la cartella esiste
    For Each item As Object In folders
        Dim folder As IDictionary(Of StringObject) = TryCast(item, IDictionary(Of StringObject))
        If folder("name").ToString() = skyDriveFolderName Then
            skyDriveFolderID = folder("id").ToString()
        End If
    Next
 
    'se la cartella non esiste, nessun backup pregresso
    If skyDriveFolderID = String.Empty Then
        MessageBox.Show("Nessun file di backup trovato.")
    Else
        'se esiste, ottengo l'elenco dei file in essa contenuti
        Dim contentResult = Await client.GetAsync(skyDriveFolderID + "/files")
        'converto la lista in IDictionary
        Dim subContentData As IDictionary(Of StringObject) = TryCast(contentResult.Result, IDictionary(Of StringObject))
        'ottengo la lista epurata
        Dim subFiles = TryCast(subContentData("data"), List(Of Object))
 
        Dim id As String = String.Empty
 
        'ciclo la lista per verificare che il file di backup esista
        For Each item As Object In subFiles
            Dim file As IDictionary(Of StringObject) = TryCast(item, IDictionary(Of StringObject))
            If file IsNot Nothing Then
                If file("name").ToString() = "MioFile.bak" Then
                    id = file("id").ToString()
                End If
            End If
 
        Next
 
        'Se non esiste..
        If id = String.Empty Then
            MessageBox.Show("Nessun file di backup trovato.")
            Exit Sub
        Else
 
            'Se invece esiste...
            'consultare post precedente per dettagli
            Dim downloadResult = Await client.DownloadAsync(String.Format("{0}/content", id))
            Dim stream = downloadResult.Stream
 
            Using storage = IsolatedStorageFile.GetUserStoreForApplication
                Using fileToSave = storage.OpenFile("MioFile.txt", FileMode.Create, FileAccess.ReadWrite)
                    Await stream.CopyToAsync(fileToSave)
                    Await stream.FlushAsync
                    stream.Close()
                End Using
            End Using
            MessageBox.Show("Operazione completata")

        End If
    End If
 
End Sub

In questo modo possiamo organizzare in maniera più appropriata i file che le nostre app devono gestire sullo spazio di archiviazione on the Cloud.

Alessandro

Print | posted on venerdì 5 luglio 2013 10:04 | Filed Under [ Silverlight e Windows Phone ]

Powered by:
Powered By Subtext Powered By ASP.NET