2013-02-01 15 views
9

Attualmente sto provando a salvare un flusso contenente un'immagine jpeg che sono tornato dalla fotocamera alla cartella di archiviazione locale. I file vengono creati ma purtroppo non contengono alcun dato. Ecco il codice che sto cercando di utilizzare:Salvataggio di un flusso contenente un'immagine nella cartella locale su Windows Phone 8

public async Task SaveToLocalFolderAsync(Stream file, string fileName) 
{ 
    StorageFolder localFolder = ApplicationData.Current.LocalFolder; 
    StorageFile storageFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 

    using (IRandomAccessStream fileStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite)) 
    { 
    using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0)) 
    { 
     using (DataWriter dataWriter = new DataWriter(outputStream)) 
     { 
     dataWriter.WriteBytes(UsefulOperations.StreamToBytes(file)); 
     await dataWriter.StoreAsync(); 
     dataWriter.DetachStream(); 
     } 
     await outputStream.FlushAsync(); 
    } 
    } 
} 

public static class UsefulOperations 
{ 
    public static byte[] StreamToBytes(Stream input) 
    { 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     input.CopyTo(ms); 
     return ms.ToArray(); 
    } 
    } 
} 

Qualsiasi aiuto per salvare i file in questo modo sarebbe molto apprezzato - tutto l'aiuto che ho trovato riferimento al salvataggio del testo in linea. Sto usando lo spazio dei nomi Windows.Storage quindi dovrebbe funzionare anche con Windows 8.

+0

Sei sicuro che questo è Windows PHONE 8? Non stai usando 'IsolatedStorageFile.GetUserStoreForApplication()' –

+1

Assolutamente sicuro, ora puoi usare lo spazio dei nomi sopra e il codice funzionerà anche su Windows 8. –

+0

Impara qualcosa di nuovo ogni giorno :) –

risposta

26

Il metodo SaveToLocalFolderAsync funziona correttamente. Ho provato su un Stream ho passato e copiato il suo contenuto completo come previsto.

Immagino sia un problema con lo stato del flusso che si sta passando al metodo. Forse hai solo bisogno di impostare la sua posizione all'inizio con file.Seek(0, SeekOrigin.Begin);. Se ciò non funziona, aggiungi quel codice alla tua domanda in modo che possiamo aiutarti.

Inoltre, è possibile rendere il proprio codice molto più semplice. Quanto segue fa esattamente lo stesso senza le classi intermedie:

public async Task SaveToLocalFolderAsync(Stream file, string fileName) 
{ 
    StorageFolder localFolder = ApplicationData.Current.LocalFolder; 
    StorageFile storageFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 
    using (Stream outputStream = await storageFile.OpenStreamForWriteAsync()) 
    { 
     await file.CopyToAsync(outputStream); 
    } 
} 
+0

grazie, potrebbe essere giusto, darò un'occhiata oggi. –

+0

Eri corretto, la posizione dello stream era alla fine. Errore ragazzo scuola Il codice che hai sopra è molto più semplice, quindi lo userò. Grazie –

+0

Dannato, l'ho svalutato per errore. Puoi modificarlo un po 'così posso votare nuovamente? –

Problemi correlati