2012-04-26 1 views
1

Quelle est la meilleure façon de lire amnd write et IO.Stream (fichier Zip downloded d'Internet dans mon cas) à ApplicationData.Current.LocalFolderÉcrire (Lire) IO.Stream vers (à partir de) ApplicationData.Current.LocalFolder

J'ai essayé

public static async Task WriteToFile(
     this System.IO.Stream input, 
     string fileName, 
     StorageFolder folder = null) 
    { 
     folder = folder ?? ApplicationData.Current.LocalFolder; 
     var file = await folder.CreateFileAsync(
      fileName, 
      CreationCollisionOption.ReplaceExisting); 
     using (var fs = await file.OpenAsync(FileAccessMode.ReadWrite)) 
     { 
      using (var outStream = fs.GetOutputStreamAt(0)) 
      { 
       using (var dataWriter = new DataWriter(outStream)) 
       { 
        byte[] buffer = new byte[8 * 1024]; 
        int len; 
        while ((len = input.Read(buffer, 0, buffer.Length)) > 0) 
        { 
         dataWriter.WriteBytes(buffer); 
        } 

        await dataWriter.StoreAsync(); 
        dataWriter.DetachStream(); 
       } 

       await outStream.FlushAsync(); 
      } 
     } 
    } 

pour l'écriture et

StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename); 
var fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); 
var stream = fileStream.AsStreamForRead(); 

mais le fichier est corrompu, quelque part le long de la way.I font pas penser qu'il ya un problème avec la lecture, il devrait être quelque part par écrit e e fichier. Existe-t-il un meilleur moyen d'écrire IO.Stream à ApplicationData.Current.LocalFolder qui fonctionne?

+0

Pourquoi y a-t-il autant d'async? –

+0

@AndrewBarber parce que c'est la nouvelle façon de faire les choses dans WinRT? – jv42

+0

@AndrewBarber Chaque opération qui peut prendre plus de 50 ms doit être effectuée async –

Répondre

0

Essayez ceci:

static async void DownloadFileAsync(
    this HttpClient httpClient, 
    string requestUri, 
    string fileName, 
    StorageFolder folder = null) 
{ 
    folder = folder ?? ApplicationData.Current.LocalFolder; 

    var file = await folder.CreateFileAsync(
     fileName, CreationCollisionOption.ReplaceExisting); 

    using (var httpStream = await httpClient.GetStreamAsync(uri)) 
    using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
    { 
     await httpStream.CopyToAsync(fileStream.AsStreamForWrite()); 
    } 
} 

MSDN: Http­Client Class, Http­Client.­Get­Stream­Async Method, Windows­Runtime­Stream­Extensions.­As­Stream­For­Write Method, Stream.­Copy­To­Async Method.

Questions connexes