Tworzenie folderu skompresowanego .zip

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.

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)

0
/// <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.

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

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

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

Dzielenie na voluminy zostało odrzucone przez biznes

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.

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.

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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1