Seite 6 von 9
Verfasst: 20.02.2009 00:28
von ts-soft
> Warum schlägt dieser Code dann fehl?
Weil die Strukture als Pointer erwartet wird
Code: Alles auswählen
XIncludeFile "MiniZIP.pbi"
mzfi.unz_file_info
Index = ZIP_GetFileNumber("music.zip","sample1.ogg")
ZIP_GetFileInfo("music.zip",Index,@mzfi)
Result = ZIP_CatchFile("music.zip",Index)
CreateFile(0,"test.ogg")
WriteData(0,Result,mzfi\uncompressed_size)
CloseFile(0)
Verfasst: 20.02.2009 00:35
von Fluid Byte
ts-soft hat geschrieben:Weil die Strukture als Pointer erwartet wird
Du verwendest im Beispiel "sample1.ogg", versuch mal "sample2.ogg".
Verfasst: 20.02.2009 00:45
von ts-soft
Fluid Byte hat geschrieben:ts-soft hat geschrieben:Weil die Strukture als Pointer erwartet wird
Du verwendest im Beispiel "sample1.ogg", versuch mal "sample2.ogg".
Es funktioniert mit beiden, test.ogg entsteht immer mit der richtigen größe
Kiffi hat geschrieben:Fluid Byte hat geschrieben:Mal am Rande, die PureZIP DLL von gnozal hat damit keine Probleme.

was Ihr (Du) mal testen könnte(s)t: Tritt dieser 'Bug' auch mit
UsePNGImageDecoder() auf? Hiermit hat nämlich die PureZIP-Lib Probleme.
Vielleicht gibt es Parallelen?
Grüße ... Kiffi
Habs mal getestet:
zip erstellen:
Code: Alles auswählen
XIncludeFile #PB_Compiler_Home + "include\minizip_include.pbi"
Define.s zip = GetTemporaryDirectory() + "flare.zip"
Define.i FF = ZIP_FileCreate(zip)
If FF
ZIP_FileAdd(FF, #PB_Compiler_Home + "Examples\Sources\Data\flare.png", "-")
ZIP_FileClose(FF)
EndIf
und testen mit dem geändertem Beispiel der Hilfe:
Code: Alles auswählen
XIncludeFile #PB_Compiler_Home + "include\minizip_include.pbi"
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
; Enable all the encoders than PureBasic actually supports
;
UseJPEGImageEncoder()
UsePNGImageEncoder()
Define.s zip = GetTemporaryDirectory() + "flare.zip"
If OpenWindow(0, 0, 0, 250, 130, "PureBasic - Image Converter", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(0, 0, 28, WindowWidth(0), WindowHeight(0), 0, #PB_Image_Border)
CreateToolBar(0, WindowID(0))
ToolBarStandardButton(0, #PB_ToolBarIcon_Open)
ToolBarStandardButton(1, #PB_ToolBarIcon_Save)
DisableToolBarButton(0, 1, 1) ; disable the save button
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Menu ; ToolBar are acting as menu
Select EventMenu()
Case 0 ; Open
If CatchImage(0, ZIP_CatchFile(zip, 1))
SetGadgetState(0, ImageID(0)) ; change the picture in the gadget
DisableToolBarButton(0, 1, 0) ; enable the save button
ResizeWindow(0, #PB_Ignore, #PB_Ignore, ImageWidth(0)+4, ImageHeight(0)+34)
EndIf
; EndIf
Case 1 ; Save
Filename$ = SaveFileRequester("Save a picture", Left(Filename$, Len(Filename$)-Len(GetExtensionPart(Filename$))-1), "BMP Format|*.bmp|JPEG Format|*.jpg|PNG Format|*.png", 0)
If Filename$
Select SelectedFilePattern()
Case 0 ; BMP
ImageFormat = #PB_ImagePlugin_BMP
Extension$ = "bmp"
Case 1 ; JPEG
ImageFormat = #PB_ImagePlugin_JPEG
Extension$ = "jpg"
Case 2 ; PNG
ImageFormat = #PB_ImagePlugin_PNG
Extension$ = "png"
EndSelect
If LCase(GetExtensionPart(Filename$)) <> Extension$
Filename$ + "." + Extension$
EndIf
If SaveImage(0, Filename$, ImageFormat)
MessageRequester("Information", "Image saved successfully", 0)
EndIf
EndIf
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow ; If the user has pressed on the close button
EndIf
End ; All is automatically freed by PureBasic
Mit IncludeBinary hab ich vorsichtshalber auch getestet, keine Problem bis
jetzt.
Verfasst: 20.02.2009 11:45
von Fluid Byte
ts-soft hat geschrieben:Es funktioniert mit beiden, test.ogg entsteht immer mit der richtigen größe
Führe die Datei mal aus!

Verfasst: 20.02.2009 12:54
von Fluid Byte
ts-soft hat geschrieben:Weil die Strukture als Pointer erwartet wird
Was genau hat es eigentlich damit auf sich? Habe ich ja vorher auch nicht als Pointer übergeben und funktioniert trotzdem. Es scheitert nur bei Dateien die eine ganz bestimmte Dateigröße überschreiten und das
ohne UseOGGSoundDecoder(). Also muss es doch zwangsläufig etwas mit MiniZIP zu tun haben.
Ich hab' mir die beiden Dateien noch mal mit 'Beyond Compare' im hexadezimalen Vergleich angesehen. Die Datei die auf Platte gespeichert wird hat zwar einen korrekten Header aber der Rest ist Schweizer Käse bzw. die beiden Dateien werden wohl miteinander "gemischt":
GoldWave kann die beschädigte OGG-Datei lesen, allerdings fehlt die Hälfte.
Verfasst: 20.02.2009 16:15
von ts-soft
Beim Streaming geht was schief
Werde es wohl in kürze behoben haben, bzw. notfalls auf das Streaming
verzichten.
// edit
Bei ExtractFile oder ExtractArchive funktionierts fehlerfrei, keine
Unterschiede in diesem Beyond Compare 3, nettes Tools, damit werde ich
den Fehler wohl rausbekommen
Verfasst: 20.02.2009 16:59
von ts-soft
Update
Fehler in
ZIP_CatchFile() gefixed

danke Fluid Byte für den Fehlerreport!
Gruß
Thomas
// edit
PS: Deine Demo.pb funzt jetzt auch!
Verfasst: 20.02.2009 17:59
von Fluid Byte
ts-soft hat geschrieben:Meine Funktion ist also Fehlerfrei, ...
ts-soft hat geschrieben:Beim Streaming geht was schief

ts-soft hat geschrieben:Unterschiede in diesem Beyond Compare 3, nettes Tools, damit werde ich den Fehler wohl rausbekommen
Beyond Compare ist eines der besten Tools die ich in den letzten Jahren gefunden habe. Somit kann ich auf einfache Weise alle nötigen Dateien für ein Backup auf ein entsprechendes Medium spiegeln. Und vor allem nur Dateien die neu hinzugekommen sind bzw. geändert wurden. Außerdem fällt die lästige Komprimierung weg die ich bei jedem anderen Tool gesehen habe. Das ist zwar nett gemeint aber überflüssig wenn man schnell Änderungen übernehmen will (und Platzmangel ist eh kein Thema mehr). Toptool!
ts-soft hat geschrieben:Fehler in ZIP_CatchFile() gefixed
Perfekt. Nun kann ich mein Werk vollenden!
ts-soft hat geschrieben:
danke Fluid Byte für den Fehlerreport!
Keine Ursache. Das war es ja wohl absolut wert.

Verfasst: 20.02.2009 18:08
von ts-soft
Fluid Byte hat geschrieben:Perfekt. Nun kann ich mein Werk vollenden!
Und ich bald beginnen (mein neues Werk, was MiniZip benötigt)
// Nachtrag:
@Fluid Byte
Hier eine beschleunigte Version von ZIP_AccessArchive aus dem Democode:
Code: Alles auswählen
Procedure ZIP_AccessArchive(Filename.s, *Length.LONG)
Protected *Mem, ZIPFile$ = "music.zip"
*Mem = ZIP_CatchFile(ZIPFile$, ZIP_GetFileNumber(ZIPFile$, Filename))
If *Mem
*Length\l = MemorySize(*Mem)
ProcedureReturn *Mem
EndIf
EndProcedure
MemorySize() sollte schneller als ZIP_GetFileInfo() sein
Verfasst: 22.02.2009 08:21
von ts-soft
Update
hinzugefügt:
ZIP_IsZipArchive(), damit kann man Archive (auch Exen u. ä) vorm entpacken überprüfen.
repariert und verbessert:
Unicode-Support
Alle Dateioperationen beschleunigt!
Danke auch an edel, der mir ein paar C-Header angepaßt hat, um dies zu ermöglichen
