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 stattarray<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 intarray<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.