2016-05-16 4 views
1

Я разрабатываю UWP и Windows phone 8.1 в том же решении.Сжатие папки в файл gzip/zip из PCL

В обоих проектах мне нужна функциональность сжатия целой папки в один файл gzip (чтобы отправить его на сервер).

библиотеки, которые я пробовал, и встречающиеся проблемы с:

SharpZipLib - использует System.IClonable, которые я не могу Referance в моем PCL проекте

DotNetZip - Не PCL/четырех опорных UWP

System.IO.Compression - Работайте только с Stream, не можете сжимать всю папку

Я могу разделить реализацию для каждой платформы (хотя это не идеально), но я все еще не нашел того, что можно использовать в UWP.

Любая помощь будет appriciated

+0

Можете ли вы объяснить, немного м руд подробно, почему вы не могли использовать IO.Compression? У меня никогда не было проблем с использованием CreateFromDirectory в библиотеках ZipFile, но я также не пишу приложение UWP или WP, так что, возможно, это проблема? – gravity

+0

О, должно быть, пропустил CreateFromDirectory :) Я попробую –

+0

Apperenlty У меня просто нет ZipFile в пространстве имен IO.Compression, у меня есть: ZipArchive, GZipStream, DeflateStream - все они работают только с Stream ... –

ответ

0

Хорошо, так что я нашел этот проект под названием SharpZipLib.Portable, который также является открытым исходным кодом Github: https://github.com/ygrenier/SharpZipLib.Portable

Действительно приятно :)

+0

Сложно работать, если вы не читаете файлы и файлы – Dagrooms

-1

Работа в библиотеке UWP вам придется использовать подсистему Потока System.IO.Compression. Есть много таких ограничений, когда вам нужна версия PCL для .NET Framework. Живи с этим.

В вашем контексте это не большая проблема.

Необходимые usings являются:

using System; 
using System.IO; 
using System.IO.Compression; 

Тогда методы ...

private void CreateArchive(string iArchiveRoot) 
    { 
     using (MemoryStream outputStream = new MemoryStream()) 
     { 
      using (ZipArchive archive = new ZipArchive(outputStream, ZipArchiveMode.Create, true)) 
      { 
       //Pick all the files you need in the archive. 
       string[] files = Directory.GetFiles(iArchiveRoot, "*", SearchOption.AllDirectories); 

       foreach (string filePath in files) 
       { 
        FileAppend(iArchiveRoot, filePath, archive); 
       } 
      } 
     } 
    } 

    private void FileAppend(
     string iArchiveRootPath, 
     string iFileAbsolutePath, 
     ZipArchive iArchive) 
    { 
     //Has to return something like "dir1/dir2/part1.txt". 
     string fileRelativePath = MakeRelativePath(iFileAbsolutePath, iArchiveRootPath); 

     ZipArchiveEntry clsEntry = iArchive.CreateEntry(fileRelativePath, CompressionLevel.Optimal); 
     Stream entryData = clsEntry.Open(); 

     //Write the file data to the ZipArchiveEntry. 
     entryData.Write(...); 
    } 

    //http://stackoverflow.com/questions/275689/how-to-get-relative-path-from-absolute-path 
    private string MakeRelativePath(
     string fromPath, 
     string toPath) 
    { 
     if (String.IsNullOrEmpty(fromPath)) throw new ArgumentNullException("fromPath"); 
     if (String.IsNullOrEmpty(toPath)) throw new ArgumentNullException("toPath"); 

     Uri fromUri = new Uri(fromPath); 
     Uri toUri = new Uri(toPath); 

     if (fromUri.Scheme != toUri.Scheme) { return toPath; } // path can't be made relative. 

     Uri relativeUri = fromUri.MakeRelativeUri(toUri); 
     String relativePath = Uri.UnescapeDataString(relativeUri.ToString()); 

     if (toUri.Scheme.Equals("file", StringComparison.OrdinalIgnoreCase)) 
     { 
      relativePath = relativePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); 
     } 

     return relativePath; 
    } 
+0

Я пытался использовать что-то подобное, но это не создало мне обычный gzip-файл (который я могу использовать для Linux-сервера, например). Вам удалось создать файл в формате gzip, который будет распакован как папка с файлами, которые вы добавили в Stream (clsEntry)? –

+0

Я смог перекомпилировать DotNetZip (https://dotnetzip.codeplex.com/) как PCL для Windows 8.1/Windows Phone 8.1 без больших проблем, занял около часа, но не пытался это сделать. Большая часть работы, которую я должен был сделать, это заменить вызовы файловой системы. –

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