Tworzenie folderu skompresowanego .zip

Tworzenie folderu skompresowanego .zip
AM
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Postów:32
0

Witam,

Próbuje zbudować mechanizm, który stworzy ze wskazanego folderu z plikami Zip-a z hasłem o określonej wielkości. W aplikacji jest już biblioteka SharpZipLib, ale nie znalazłem sensownej dokumentacji, lub przykładu do mojego problemu.

Kopiuj
string startPath = _configuration.GetConnectionString("FileRepository");
string zipPath = $@"{startPath}\ERAD\{m.PackId}.zip"; // folder docelowy
string toZipPath = $@"{startPath}\ERAD\{m.PackId}\"; // folder źródłowy 
string Pasword = "123";


var zipFile = new FastZip
{
    Password = Pasword,
    CompressionLevel = ICSharpCode.SharpZipLib.Zip.Compression.Deflater.CompressionLevel.BEST_COMPRESSION,
    CreateEmptyDirectories = true,
};
zipFile.CreateZip(zipPath, toZipPath, true, "");

Aktualnie używam kodu powyżej ale tworzy on jeden folder zip z plikami wewnątrz. Natomiast obecnie dostałem wytyczne o maksymalnej wielkości

P.S pliki w docelowym folderu są mniej więcej tej samej wielkości (format pdf)

edytowany 2x, ostatnio: Riddle
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:20 dni
0

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
AM
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Postów:32
0
Kopiuj
/// <summary>
		/// Gets or sets the setting for <see cref="UseZip64">Zip64 handling when writing.</see>
		/// </summary>
		/// <remarks>
		/// The default value is dynamic which is not backwards compatible with old
		/// programs and can cause problems with XP's built in compression which cant
		/// read Zip64 archives. However it does avoid the situation were a large file
		/// is added and cannot be completed correctly.
		/// NOTE: Setting the size for entries before they are added is the best solution!
		/// By default the EntryFactory used by FastZip will set the file size.
		/// </remarks>
		public UseZip64 UseZip64
		{
			get { return useZip64_; }
			set { useZip64_ = value; }
		}

@_13th_Dragon: w tym co podesłałeś znalazłem taki fragment, może coś takiego ?
Czy źle coś zrozumiałem.
Bo jeśli faktycznie się nie da to muszę znaleźć inną bibliotekę, albo zrobić przykładowy folder, zobaczyć ile plików w środku zmieści się zanim przekroczy max wielkość i wówczas jakaś metodą add dodawać w pętli pliki do zipowego folderu.

edytowany 2x, ostatnio: AdamAdam_MF
_13th_Dragon
Użyj google translatora jak nie umiesz przeczytać.
AM
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Postów:32
0

Ok, z tą biblioteką faktycznie musze się poddać,

A znacie może jakiś sposób, żeby tworzyć kolejne zip-y jeśli wcześniejszy dojdzie do np 10 MB ?

Lub plan b utworzyć pustego zippa i poprzez add dodawać po 20 plików z listy, później koeljny zip_2 i kolejne 20 plików itd.

lub plan c jeśli się da to stworzyć zipa jak dotej pory a następnie podzielić go tyle razy żeby mieścił sie w limicie tych przykładowych 10 MB

P.S. aplikacja korzysta z .NET6

edytowany 3x, ostatnio: AdamAdam_MF
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:20 dni
0
AdamAdam_MF napisał(a):

A znacie może jakiś sposób, żeby tworzyć kolejne zip-y jeśli wcześniejszy dojdzie do np 10 MB ?

Zawsze możesz wywołać przez Process oryginalnego Zip'a przez command line

Kopiuj
            Process pr=Process.Start("zip", "-r nameoffile.zip directory");
            pr.WaitForExit();
            int ret = pr.ExitCode;
            // https://www.computerhope.com/unix/zip.htm

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
AM
Czy mógłbyś podać przykład, jeśli dobrze rozumiem utworzę zip-a i dopiero wówczas go podzielić?
HI
  • Rejestracja:około 13 lat
  • Ostatnio:3 dni
  • Postów:1857
0
_13th_Dragon
Czytanie dokumentacji, oglądanie przykładów, użycie google to zbyt mainstream'owe :P
AM
Szczerze to z podziałem nie. Dziś dopiero wpadłem na taki pomysł. ;)
AM
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Postów:32
0

Dzielenie na voluminy zostało odrzucone przez biznes

Kopiuj
using Ionic.Zip;


int numberOfTurn = 1;
        int numberForLastPack = 1;
        int numberForFolder = 1;
        int filesNumber = Directory.GetFiles(zipPath).Count();

        var zip = new ZipFile();
        foreach (string file in Directory.GetFiles(zipPath))
        {
            zip.Password = Pasword;


            zip.AddFile(file, @"\");

            if (numberOfTurn == 50 || numberForLastPack == filesNumber)
            {
                string FinalZipPath = $@"{toZipPath}\{genContractFileName}_{numberForFolder}.zip";
                zip.Save(FinalZipPath);
                zip.Dispose();
                zip = new ZipFile();
                numberOfTurn = 1;
                numberForFolder++;
            }
            numberOfTurn++;
            numberForLastPack++;
        }

mam, teraz dzięki temu po przekroczeniu 50 plików mechanizm tworzy nowego zipa.

P0
  • Rejestracja:ponad 11 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Warszawa
  • Postów:22
0

Natknąlem się na coś takiego: https://github.com/hamza72x/zip-split-independent
Ewentualnie zawsze pozostaje sprawdzanie rozmiaru archiwum po dodaniu każdego pliku.

BR
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 miesięcy
  • Postów:50
0

@AdamAdam_MF: to podejście zadziała tak długo jak pliki wejściowe są z grubsza takie same (znaczy rozmiarowo i w sensie zawartości). Rozmiar pliku wynikowego zależy też od algorytmu kompresującego. Więc jeśli zmienisz któryś z tych elementów to Ci się ten algorytm ze stałą liczbą plików w paczce może rozjechać. Oczywiście jak w przewidywalnej przyszłości ww. zmiany nie zajdą to rozwiązanie będzie hulać jeszcze przez lata :)


Prowadzenie firmy, zarządzanie, programowanie, randomowe narzekanie, wiele melanży, dwie dekady w branży - dzielę się tym co jeszcze pamiętam: https://brzezmac.io
AM
Rozumiem. Pliki są identyczne tj, pdf z 2-3 stronami. Niestety moje rozwiązania zależą od biznesu, który ma ostatnie słowo, a skoro oni ponoszą koszt to jak to mówią, "Klient nasz pan".

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.