Problem beim verwenden von LZMA
-
Hi leute.
Ich bin verwende in einem Projekt die LZMA klassen von 7z
http://www.7-zip.org/sdk.html
beim anwenden funktioniert die komprimierung einwandfrei. jedoch bei der dekomprimierung bekomme ich fehler.
Die Sache ist die, ich benötige die de/komprimierung via stream (weis nicht ob das das problem ist -.-Hier mal der code:
System.IO.StreamReader input2 = new System.IO.StreamReader(@"C:\x.mp3"); System.IO.StreamWriter output1 = new System.IO.StreamWriter(@"C:\y.7z"); dec.Code(input1.BaseStream, output1.BaseStream, -1, -1, null); output1.Close(); input1.Close(); System.IO.StreamReader input2 = new System.IO.StreamReader(@"C:\y.7z"); System.IO.StreamWriter output2 = new System.IO.StreamWriter(@"C:\z.mp3"); dec.Code(input2.BaseStream, output2.BaseStream, -1, -1, null); output2.Close(); input2.Close();
-
Wäre es zu viel verlangt, wenn du uns diese Fehler mitteilst? Oder soll dies ein Ratespiel werden?
Grüssli
-
also es ist eine NullReferenceException
nochmal mehr code..
SevenZip.Compression.LZMA.Decoder dec = new SevenZip.Compression.LZMA.Decoder(); SevenZip.Compression.LZMA.Encoder enc = new SevenZip.Compression.LZMA.Encoder(); private void button1_Click(object sender, EventArgs e) { System.IO.StreamReader input1 = new System.IO.StreamReader(@"C:\x.mp3"); System.IO.StreamWriter output1 = new System.IO.StreamWriter(@"C:\y.lzm"); dec.Code(input1.BaseStream, output1.BaseStream, -1, -1, null); output1.Close(); input1.Close(); } private void button2_Click(object sender, EventArgs e) { System.IO.StreamReader input2 = new System.IO.StreamReader(@"C:\x.mp3"); System.IO.StreamWriter output2 = new System.IO.StreamWriter(@"C:\z.lzm"); dec.Code(input2.BaseStream, output2.BaseStream, -1, -1, null); output2.Close(); input2.Close(); }
-
robsl2314 schrieb:
also es ist eine NullReferenceException
Und wo?
Lass Dir doch nicht alles aus der Nase ziehen.(Du verwendest enc nirgends)
-
Versuch's mal so:
using SevenZip.Compression.LZMA; private static void CompressFileLZMA(string inFile, string outFile) { SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder(); using (FileStream input = new FileStream(inFile, FileMode.Open)) { using (FileStream output = new FileStream(outFile, FileMode.Create)) { coder.Code(input, output, -1, -1, null); output.Flush(); } } }
PS: Warum verwendest du nicht eine der System.IO.Compression-Methoden? Die funktionieren robust und zuverlässig.
-
schmidt-webdesign.net schrieb:
PS: Warum verwendest du nicht eine der System.IO.Compression-Methoden? Die funktionieren robust und zuverlässig.
Und sind langsam und nur sehr eingeschränkt einsetzbar. Ich persönlich nehme für ZIP Komprimierung unter .Net immer DotNetZip. Aber wenn man natürlich die 7z Kompression will, dass muss man auch die 7z Bibliothek verwenden
Grüssli
-
Dravere schrieb:
schmidt-webdesign.net schrieb:
PS: Warum verwendest du nicht eine der System.IO.Compression-Methoden? Die funktionieren robust und zuverlässig.
Und sind langsam und nur sehr eingeschränkt einsetzbar. Ich persönlich nehme für ZIP Komprimierung unter .Net immer DotNetZip. Aber wenn man natürlich die 7z Kompression will, dass muss man auch die 7z Bibliothek verwenden
Grüssli
"Langsam" kann ich nicht bestätigen. In einem DVD-Projekt werden hier die wöchentlich aktualisierten IMDB-Archive (GZIP) mit der GZipStream-Klasse automatisch entpackt - keinen Deut langsamer als z.B. mit WinRAR.
-
schmidt-webdesign.net schrieb:
"Langsam" kann ich nicht bestätigen. In einem DVD-Projekt werden hier die wöchentlich aktualisierten IMDB-Archive (GZIP) mit der GZipStream-Klasse automatisch entpackt - keinen Deut langsamer als z.B. mit WinRAR.
Verwendest du dafür .Net 4.0?
Grüssli
-
Okay ja ich verwende .net 4.0
das mit der GZipStream-Klasse hab ich schon probiert nur is das problem, dass ich große mengen an Zufallszahlen komprimieren will und mit der gzipklasse war die datei am ende rund 10% größer als zu beginn.und an dich schmidt, habs so probiert is aber immer noch der selbe fehler.
Die NullReferenceException wird in der Klasse LZMADecoder erzeugt. bei der bei der Init funktion.ist es viellecht möglich, dass die zeile:
coder.Code(input, output, -1, -1, null);
wenn man null weiter gibt den fehler verursacht?
-
Vielleicht hilft dir dieser Code weiter.
(bessere?) Alternativen wären bzip2 und RAR. Damit könnten deine Zufallszahlen u.U. kompakter komprimiert werden.
Wer jetzt glaubt, ich würde SevenZipSharp nicht mögen, glaubt richtig.
~Erst wenn alle Programmierer eingesperrt und alle Ideen patentiert wurden, werdet ihr merken, dass Juristen nicht programmieren können ...~
-
danke für den tipp mit dem code..
ist denn rar auch als open sorce code für C# vorhanden?
und ist die kompressionsrate von rar wirklich besser als von 7z?