2015-07-06 1 views
8

Я хотел бы добавить библиотеку SharpZipLib.Portable в мой проект Xamarin.Forms PCL. Я нацелен на Android и iOS. В документации упоминается, что вы должны использовать VirtualFileSystem для использования библиотеки, но я не знаю, как это сделать, и я не смог найти много информации по этой теме.Как реализовать VirtualFileSystem, требуемую SharpZipLib.Portable?

Кто-нибудь использовал эту библиотеку, которая может помочь мне в действиях, необходимых для ее использования?

ответ

10

Я оказался здесь, пытаясь реализовать SharpZipLib.Portable. Я начал использовать его без IVirtualFileSystem, потому что у меня уже была библиотека (PCLStorage), которая знает, как читать и писать в файловой системе (протестировала ее на iOS и Android).

ПРИМЕЧАНИЕ: Эта реализация все внутри PCL таргетирования iOS, Android. Не требуется никакого специального кода для Android или iOS.

Вот простой пример того, как извлечь Zip файл с помощью PCLStorage и 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); 
       } 
      } 
     } 
    }      
} 

Если вы хотите получить некоторые примеры того, как использовать SharpZipLib.Portable вы можете прочитать здесь (оригинал SharpZipLib): Code reference и Zip samples.

АЛЬТЕРНАТИВА:

После делать то, что я объяснил выше, я в конечном итоге с гораздо более простым решением, потому что я нужен только для поддержки ZIP файлов. Я использовал ZipArchive Class в System.IO.Compression и PCLStorage, поэтому с этим решением я не использовал 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(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); 
       } 
      } 
     } 
    }      
}