2015-07-06 18 views
8

Vorrei aggiungere la libreria SharpZipLib.Portable al mio progetto PCL Xamarin.Forms. Ho scelto Android e iOS. La documentazione menziona che è necessario implementare uno VirtualFileSystem per utilizzare la libreria, ma non so come farlo e non sono riuscito a trovare molte informazioni su questo argomento.Come implementare VirtualFileSystem richiesto da SharpZipLib.Portable?

Qualcuno ha utilizzato questa libreria che può guidarmi nei passaggi necessari per usarlo?

risposta

10

Sono finito qui quando ho provato a implementare lo SharpZipLib.Portable. Inizio a usarlo senza lo IVirtualFileSystem perché avevo già una libreria chiamata (PCLStorage) che sa leggere e scrivere nel filesystem (testata su iOS e Android).

NOTA: Questo implementazioni sono tutti all'interno di un PCL mira iOS, Android. Non sono necessari codici specifici per Android o iOS.

Ecco un semplice esempio come estrarre un file zip utilizzando PCLStorage e SharpZipLib.Portable:

public async void DonwLoadAndStoreZipFile() 
{ 
    var bytes = await DownloadImageAsync("https://github.com/fluidicon.png"); 

    // IFolder interface comes from PCLStorage  
    IFolder rootFolder = FileSystem.Current.LocalStorage; 
    IFolder folder = await rootFolder.CreateFolderAsync("zipFolder", CreationCollisionOption.OpenIfExists); 
    IFile file = await folder.CreateFileAsync("test.zip" , CreationCollisionOption.OpenIfExists); 

    using (Stream stream = await file.OpenAsync(FileAccess.ReadAndWrite)) 
    { 
     await stream.WriteAsync(bytes, 0, bytes.Length); 
     using (var zf = new ZipFile(stream)) 
     { 
      foreach (ZipEntry zipEntry in zf) 
      {     
       // Gete Entry Stream. 
       Stream zipEntryStream = zf.GetInputStream(zipEntry); 

       // Create the file in filesystem and copy entry stream to it. 
       IFile zipEntryFile = await rootFolder.CreateFileAsync(zipEntry.Name , CreationCollisionOption.FailIfExists); 
       using(Stream outPutFileStream = await zipEntryFile.OpenAsync(FileAccess.ReadAndWrite)) 
       { 
        await zipEntryStream.CopyToAsync(outPutFileStream); 
       } 
      } 
     } 
    }      
} 

Se si desidera ottenere alcuni esempi su come utilizzare il SharpZipLib.Portable potete leggere qui (original SharpZipLib): Code reference e Zip samples.

ALTERNATIVA:

Dopo aver fatto ciò che ho spiegato sopra ho finito con una soluzione molto più semplice, perché solo avevo bisogno di supportare i file ZIP. Ho usato ZipArchive Class presente in System.IO.Compression e PCLStorage, quindi con questa soluzione non utilizzo SharpZipLib.Portable.

Ecco la versione:

public async void DonwLoadAndStoreZipFile() 
{ 
    var bytes = await DownloadImageAsync(https://github.com/fluidicon.png); 

    // IFolder interface comes from PCLStorage 
    IFolder rootFolder = FileSystem.Current.LocalStorage; 
    IFolder folder = await rootFolder.CreateFolderAsync("zipFolder", CreationCollisionOption.OpenIfExists); 
    IFile file = await folder.CreateFileAsync("test.zip" , CreationCollisionOption.OpenIfExists); 

    using (Stream stream = await file.OpenAsync(FileAccess.ReadAndWrite)) 
    { 
     await stream.WriteAsync(bytes, 0, bytes.Length); 
     using(ZipArchive archive = new ZipArchive(stream)) 
     { 
      foreach (ZipArchiveEntry entry in archive.Entries) 
      { 
       IFile zipEntryFile = await rootFolder.CreateFileAsync(entry.Name, CreationCollisionOption.FailIfExists); 
       using (Stream outPutStream = await zipEntryFile.OpenAsync(FileAccess.ReadAndWrite)) 
       { 
        await entry.Open().CopyToAsync(outPutStream); 
       } 
      } 
     } 
    }      
}