GZipStream<->File - Komprimierungs/Dekomprimierungsproblem



  • Hallo zusammen.
    Habe mir eine kleine Gzip-Funktion erstellt, um Dateien zu komprimieren, bzw. zu dekomprimieren...
    Definitionen:

    #define SOURCENOTFOUND "101"
    #define DESTEXISTS "102"
    #define CANTCREATEFILE "103"
    #define GZIPFILENOTFOUND "190"
    

    using:

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::IO;
    using namespace System::IO::Compression;
    using namespace System::Drawing;
    using namespace System::Text;
    

    Funktionen:

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e)
    	{
    	try { CompressFile("C:\\testtext.txt", "C:\\testtext.gz"); }
    	catch (Exception ^ex)
    		{
    		if (ex->Message==SOURCENOTFOUND) { /* Quelldatei nicht gefunden */ }
    		if (ex->Message==DESTEXISTS) { /* Ziel existiert bereits */ }
    		if (ex->Message==CANTCREATEFILE) { /* Ziel konnte nicht erstellt werden. */ }
    		}
    	try { DecompressFile("C:\\testtext.gz", "C:\\testziel.txt"); }
    	catch (Exception ^ex)
    		{
    		if (ex->Message==GZIPFILENOTFOUND) { /* Gzip-Datei nicht gefunden. */ }
    		if (ex->Message==DESTEXISTS) { /* Ziel schon vorhanden */ }
    		if (ex->Message==CANTCREATEFILE) { /* Ziel konnte nicht erstellt werden */ }
    		}
    	}
    
     public: void CompressFile(String^ inputFileName, String^ outputFileName) 
    	{
    	if (!File::Exists(inputFileName)) throw gcnew Exception(SOURCENOTFOUND);
    	if (File::Exists(outputFileName)) throw gcnew Exception(DESTEXISTS);
        array<Byte>^ buffer = gcnew array<Byte>(4096);
    	FileStream^ inputFile;
    	int n = 0;
    	inputFile = gcnew FileStream(inputFileName, FileMode::Open, FileAccess::Read, FileShare::Read);
    	FileStream^ outputFile = File::Create(outputFileName);
    	if (!File::Exists(outputFileName)) throw gcnew Exception(CANTCREATEFILE);
    	GZipStream^ gzip = gcnew GZipStream(outputFile, CompressionMode::Compress);
    	while((n = inputFile->Read(buffer, 0, buffer->Length)) != 0) { gzip->Write(buffer, 0, n); }
    	gzip->Close();
    	inputFile->Close();
    	outputFile->Close();
    	}
    
    public: void DecompressFile(String^ inputFileName, String^ outputFileName) 
    {
    	array<Byte>^buffer = gcnew array<Byte>(4096);
    	if (!File::Exists(inputFileName)) throw gcnew Exception(GZIPFILENOTFOUND);
    	if (File::Exists(outputFileName)) throw gcnew Exception(DESTEXISTS);
    	FileStream^ inputFile = gcnew FileStream(inputFileName, FileMode::Open);
    	FileStream^ outputFile = File::Create(outputFileName);
    	if (!File::Exists(outputFileName)) throw gcnew Exception(CANTCREATEFILE);
    	GZipStream^ gzip = gcnew GZipStream(outputFile, CompressionMode::Decompress);
    	int n = 0;
    	while ((n = gzip->Read(buffer, 0, buffer->Length)) != 0) { outputFile->Write(buffer, 0, n); }
    	gzip->Close();
    	inputFile->Close();
    	outputFile->Close();
    	}
    

    Beim Schreiben der Datei testtext.txt (85 Byte) ins Gzip-Format läuft die Komprimierung soweit gut (also es besteht Inhalt... 182 Byte).
    Jedoch beim Dekomprimieren wird zwar die Zieldatei geschrieben, sofern sie nicht existiert, aber der Inhalt (Testziel.txt) ist 0-Byte lang.
    Wer kann mir sagen, wo der Fehler liegt? Visual C++ 2005 macht keinerlei Fehlermeldung beim Build, sowie auch keine sonstigen Exceptions.



  • GZipStream^ gzip = gcnew GZipStream(inputFile, CompressionMode::Decompress);


Anmelden zum Antworten