Laden...

zip und 7zip Archiv mit C# erstellen

Erstellt von Stani80 vor 9 Jahren Letzter Beitrag vor 9 Jahren 8.062 Views
S
Stani80 Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren
zip und 7zip Archiv mit C# erstellen

Hallo,

ich mache in meiner Freizeit gerade ein kleines Projekt und möchte hierzu eine Datei mit dem WPF SaveFileDialog speichern siehe: SaveFileDialog bearbeiten

Diese Datei soll auch als zip oder 7zip Archiv gespeichert werden können. Leider finde ich bisher keine geeigneten libraries. Habe etwas gegooglet und dann mal die DotNetZip versucht. Geht für ZIP gut, aber ich glaube nicht für 7zip oder doch?

Wie würdet ihr es implementieren?

Habe daran gedacht direkt mit der 7z.exe das ganze zu verwirklichen wie es hier beschrieben ist: http://www.dotnetperls.com/7-zip

Code:

static void Main()
{
	string sourceName = "ExampleText.txt";
	string targetName = "Example.gz";

	// 1
	// Initialize process information.
	//
	ProcessStartInfo p = new ProcessStartInfo();
	p.FileName = "7za.exe";

	// 2
	// Use 7-zip
	// specify a=archive and -tgzip=gzip
	// and then target file in quotes followed by source file in quotes
	//
	p.Arguments = "a -tgzip \"" + targetName + "\" \"" + sourceName + "\" -mx=9";
	p.WindowStyle = ProcessWindowStyle.Hidden;

	// 3.
	// Start process and wait for it to exit
	//
	Process x = Process.Start(p);
	x.WaitForExit();
}

Mit ein wenig anpassen läuft das ganze auch. Ist das eine gute Lösung oder gibt es bessere?

B
357 Beiträge seit 2010
vor 9 Jahren

Es ist auf jeden Fall eine Lösung. Wenn die für dich in Ordnung ist, ist es auch schon die Lösung.

Besser geht natürlich immer. 7Zip hat z.B. ein SDK mit C#-Samples, mit dem man selbst basteln kann. Auch gibt es mit SharpCompress einen Wrapper.

S
Stani80 Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

Bin halt immer bestrebt die optimalste Lösung zu nutzen.

Zu SharkCompress:
Das habe ich auch mal ins Auge gefasst bzw. wollte es testen, aber ich glaube das unterstützt nicht das Erstellen eines 7zip Archives:
SharpCompress - a fully native C# library for RAR, 7Zip, Zip, Tar, GZip, BZip2

B
357 Beiträge seit 2010
vor 9 Jahren

Stimmt, aber der Code ist da, sprich, du kannst das Komprimieren ggf. auch selbst implementieren. Oder eben das SDK mal anschauen, ob du da was brauchbares drin findest.

T
2.224 Beiträge seit 2008
vor 9 Jahren

Am besten sollte es sein von 7zip das SDK zu nehmen.
Zip könnte man sonst mit .NET 4.0+ einbinden ohne zusätzliche Abhängigkeiten.
Da 7zip aber schon fast alles dabei hat, kann man direkt darauf springen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
322 Beiträge seit 2007
vor 9 Jahren

Hallo,

hast Du dieses mal ausprobiert?

http://sevenzipsharp.codeplex.com/

Ich habe es schon mal erfolgreich einsetzen können.

S
Stani80 Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

Ja da war ich auch schon, aber die Dokumentation ist mangelhaft bzw. die Beispiele unvollständig (fehlende Libs).

T
415 Beiträge seit 2007
vor 9 Jahren

Eigentlich ist es relativ simpel Sevenzipsharp einzubinden und für die gängigen Operationen sollten sich auch genug Codebeispiele finden lassen. Die Lib benötigt, wenn ich mich recht erinnere, die originale 7zip.dll als Referenz. Wo genau hat es denn nicht hingehauen? Ich hab ebenfalls ein Projekt in dem die Lib super funktioniert.

S
Stani80 Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

Hallo,

SevenZip funktioniert jetzt. Hatte beim Source dummerweise ein File statt eines Ordners angegeben.

Ich hab das schon richtig gelesen, dass SevenZipSharp das Packen UND Enpacken für sowohl 7zip als auch Zip und sogar Streams supported?

https://sevenzipsharp.codeplex.com/

You can compress streams, files or whole directories in OutArchiveFormat - 7-zip, Xz, Zip, GZip, BZip2 and Tar.

T
415 Beiträge seit 2007
vor 9 Jahren

Ja, das sollte in beide Richtungen gehen.

S
322 Beiträge seit 2007
vor 9 Jahren

Hier habe ich damals noch mein Beispiel gepostet:

SharpZipLib - Multithreading Compress - Progress

S
Stani80 Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

Hallo,

danke für den Hinweis. Meine Methode hat gut funktioniert und ich hab sie mit 1-2 Zeilen von deiner noch erweitert.

Damit es 100% funktioniert steh ich noch vor einem Problem. Ich lass für den input Ordner ein Verzeichnis im Temp ermitteln:

Environment.GetEnvironmentVariable("TEMP")

Dann bekomme ich allerdings:
C:\Users\SMILOV~1\AppData\Local\Temp\TestApp

statt
C:\Users\SMilovenskah\AppData\Local\Temp\TestApp

Weiß jemand wie ich den vollen Namen ohne Tilde bekomme?

2.298 Beiträge seit 2010
vor 9 Jahren

Hallo,

Path.GetTempPath() liefert dir den temporären Pfad so zurück wie du es möchtest. 😉
Damit sparst du dir das direkte auslesen der Umgebungsvariable.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

S
Stani80 Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

Ja habs inzwischen rausbekommen.

Das allerletzte Problem (alle anderen hab ich inzwischen gelöst) ist, dass das Compressing Event nicht ausgelöst wird und ich somit keine Progressbar nutzen kann.

Das Compressing event funktioniert zwar mit 7zip, jedoch nicht mit ZIP

T
415 Beiträge seit 2007
vor 9 Jahren

Ich kann mich ganz dunkel dran erinnern, dass ich damals dasselbe Problem mit dem Event bei den ZIP Files hatte und ich hab es dann einfach in den, zum Glück zur Verfügung stehenden, Sourcen nachimplementiert. Das sollte kein großes Ding sein.

S
Stani80 Themenstarter:in
13 Beiträge seit 2014
vor 9 Jahren

👍