Probleme mit SharpZipLib



  • Hallo ich möchte mein Problem kurz schildern
    Ich habe mir ein kleines Tool geschrieben mit dem ich recht komfortabel Templates für Joomla erstellen kann und jetzt scheitert es daran die erzeugten Dateien in eine Zip Datei zu verfrachten.

    Da .Net irgendwie keine Klassen dafür bereit zu stellen scheint habe ich mich der SharpZipLib bedient.
    Alles in allem bekomme ich damit auch ein Ziparchiv erstellt und die Dateien verpackt allerdings nimmt Joomla das Archiv so nicht an.
    Ich habe das ganze mit c++ geschrieben.
    Witziger weise nimmt Joomla das archiv an wenn ich den buffer mit einem festen wert übergebe also statt

    array<Byte>(System::IO::FileInfo(files[a]).Length);
    z.B.
    array<Byte>(4096)
    

    verwende aber das funktioniert so natürlich nicht.
    Ich komm wirklich nicht dahinter was ich hier falsch mache und warscheinlich seh ich den Wald vor lauter bäumen nicht.

    Wenn sich jemand damit auskennt wäre ich sehr dankbar für einen Tip.

    und hier ist der Code

    void JZip()
    		{
    			//Liefert alle Dateien die in das Archiv sollen
    			System::Collections::Generic::List<String^>^ files = this->GetAllFiles();
    			//erzeugt einen relativen Pfad für das archiv
    			System::Collections::Generic::List<String^>^ relative = gcnew System::Collections::Generic::List<String^>;
    			for(Int32 a = 0; a < files->Count; a+=1)
    			{
    				relative->Add(files[a]->Remove(0,this->projektPfad->Length+1));
    			}
    
    			ICSharpCode::SharpZipLib::Zip::ZipOutputStream^ zs = gcnew ICSharpCode::SharpZipLib::Zip::ZipOutputStream(System::IO::File::Create(this->projektPfad+"\\export\\joomla\\"+this->projektName+".zip"));
    			zs->SetLevel(1);
    
    			//Die Dateien in das Archiv schreiben
    			 for(Int32 a = 0; a < files->Count; a++)
    			 {
    				 System::IO::FileStream^ fs = System::IO::File::OpenRead(files[a]);
    
    				 array<Byte>^ buffer = gcnew array<Byte>(System::IO::FileInfo(files[a]).Length);
    
    				 fs->Read(buffer,0,buffer->Length);
    
    				 ICSharpCode::SharpZipLib::Zip::ZipEntry^ entry = gcnew ICSharpCode::SharpZipLib::Zip::ZipEntry(relative[a]);
    				 entry->DateTime = System::DateTime::Now;
    				 zs->PutNextEntry(entry);
    				 zs->Write(buffer,0,buffer->Length);
    				 fs->Close();
    			 }
    
    			 zs->Finish();
    			 zs->Close();
    		}
    

    Hätt ich fast vergessen...
    Der Kompiler beschwärt sich bei dieser Zeile über einen möglichen Datenverlust
    bei der Konvertierung von Int64 in int

    array<Byte>^ buffer = gcnew array<Byte>(System::IO::FileInfo(files[a]).Length);
    

    allerdings glaube ich nicht das es daran liegt die zu verpackenden Dateien sind zwischen 3 und 300 kb groß falls das was zur sache tut.
    array<Byte>^ buffer = gcnew array<Byte>(System::IO::FileInfo(files[a]).Length);



  • http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx
    Ev. hilfts weiter... besonders die erwähnte Library DotNetZip.


Anmelden zum Antworten