2014-10-31 1 views
2

У меня есть сценарий, где мне нужно распаковать папку рекурсивно. Я прошел через несколько ссылок, но не соответствовал моим требованиям. Я использую mono 3.2.6 и вам нужно извлечь рекурсивно в android xamarin.Unzip папку reccursively в Android Xamarin mono 3.2.6

Я использовал сторонний инструмент ICSharpCode.SharpZipLib.Zip. Это отлично работает в моем приложении в режиме отладки. Но выдает ошибку в режиме деблокирования. После установки APK в реальном устройстве.

Даже попробовал Dotnet.Zip, но я не могу распаковать папку рекурсивно. here предложил DLL с открытым исходным кодом, но оно сосредоточено на файл, а затем папку

Другой link который показывает решение в Java андроида, я ищу такого же типа в C# Xamarin андроид. Есть ли способ сделать это, даже бесплатные сторонние инструменты в порядке. кто-нибудь может предложить мне решение или намеки.

ответ

5

Если это ошибка в режиме деблокирования, это может быть из-за компоновщика. Чтобы сжать и распаковать файлы, которые вы также можете использовать

java.util.zip

пакет. Больше информации here.

Edit: Пример код

включает пространство имена using Java.Util.Zip;

using (ZipInputStream s = new ZipInputStream (File.OpenRead (strSourcePath))) 
{ 
    ZipEntry theEntry; 
    while ((theEntry = s.NextEntry) != null) 
    { 
     string directoryName = Path.GetDirectoryName (theEntry.Name); 
     string fileName = Path.GetFileName (theEntry.Name); 
     directoryName = Path.Combine (strDestFolderPath , directoryName); 
     if (directoryName.Length > 0) 
     { 
      Directory.CreateDirectory (directoryName); 
     } 
     if (fileName != String.Empty) 
     { 
      using (FileStream streamWriter = File.Create (Path.Combine (strDestFolderPath , theEntry.Name))) 
      { 
       int size = 2048; 
       byte [] data = new byte[size]; 
       while (true) 
       { 
        size = s.Read (data , 0 , data.Length); 
        if (size > 0) 
        { 
         streamWriter.Write (data , 0 , size); 
        } 
        else 
        { 
         break; 
        } 
       } 
      } 
     } 
    } 
} 

где strSourcePath является истоком почтового файла и strDestFolderPath это путь к папке назначения

+1

Это работало для меня, другое решение заключается в том, чтобы добавить параметр «Интернализация» компоновщика ссылок на «запад». Android-> Build-> Linker-> Интернационализация-запад – Suchith

0

Вы также можете использовать пространство имен System.IO.Compression ,

public static async Task ExtractToDirectory(string strSourcePath, string strDestFolderPath, 
     IProgress<int> progessReporter) 
    { 

     await Task.Factory.StartNew(() => 
     { 

      using (ZipArchive archive = new ZipArchive(File.Open(strSourcePath, FileMode.Open))) 
      { 
       double zipEntriesExtracted = 0; 
       double zipEntries; 

       zipEntries = archive.Entries.Count; 

       foreach (ZipArchiveEntry entry in archive.Entries) 
       { 
        try 
        { 
         string fullPath = Path.Combine(strDestFolderPath, entry.FullName); 
         if (String.IsNullOrEmpty(entry.Name)) 
         { 
          Directory.CreateDirectory(fullPath); 
         } 
         else 
         { 
          var destFileName = Path.Combine(strDestFolderPath, entry.FullName); 

          using (var fileStream = File.Create(destFileName)) 
          { 
           using (var entryStream = entry.Open()) 
           { 
            entryStream.CopyTo(fileStream); 
           } 
          } 
         } 

         zipEntriesExtracted++; 
         progessReporter.Report((int)((zipEntriesExtracted/zipEntries) * 100)); 
        } 
        catch (Exception ex) 
        { 

        } 
       } 
      } 

     }, TaskCreationOptions.LongRunning); 


    } 
Смежные вопросы