2015-07-06 12 views

Odpowiedz

10

Skończyłem tutaj, próbując wdrożyć SharpZipLib.Portable. Zaczynam go używać bez IVirtualFileSystem, ponieważ miałem już bibliotekę o nazwie (PCLStorage), która wie, jak czytać i pisać w systemie plików (przetestowane na iOS i Android).

UWAGA: Ten implementacje są wewnątrz PCL kierowania iOS, Android. Nie jest wymagany żaden specjalny kod dla systemu Android lub iOS.

Oto prosty przykład jak wyodrębnić plik zip za pomocą PCLStorage i 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); 
       } 
      } 
     } 
    }      
} 

Jeśli chcesz uzyskać kilka przykładów, w jaki sposób korzystać z SharpZipLib.Portable można przeczytać tutaj (oryginalna SharpZipLib): Code reference i Zip samples.

ALTERNATYWA:

Po robi to, co wyjaśniono powyżej skończyło się znacznie prostsze rozwiązanie, bo tylko potrzebne do obsługi plików ZIP. Użyłem ZipArchive Class obecnych w System.IO.Compression i PCLStorage, więc z tym rozwiązaniem nie używam SharpZipLib.Portable.

Oto wersja:

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); 
       } 
      } 
     } 
    }      
} 
Powiązane problemy