[GELÖST] Dateiausleseproblem?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] Dateiausleseproblem?

BeitragSa, Aug 13, 2011 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe folgenden Code: BlitzMax: [AUSKLAPPEN]
Function LoadPackage(PackageFilePath:String, FileToBeDepackagedPath:String, extractto:String) 'FUNKTIONIERT

DebugLog "LoadPackage übergebene Parameter: " + PackageFilePath + ", " + FileToBeDepackagedPath + ", " + extractto + ""

Local PackageFile = ReadFile(PackageFilePath)
DebugLog "Package geöffnet!"
If PackageFile = 0 Then
Return 0
EndIf

Local PackageName:String
Local PackageSize:Int
Local PackagePos:Int = 0

Repeat
If Eof(PackageFile) Then
Return 0
EndIf

PackageName = ReadString2(PackageFile)
PackageSize = ReadInt(PackageFile)
DebugLog "PackageName = " + PackageName + ", PackageSize = " + PackageSize
kontrolle = 0
Repeat
ReadByte(PackageFile)
kontrolle = kontrolle + 1
Until kontrolle = PackageSize
Until PackageName = FileToBeDepackagedPath
DebugLog "Datei gefunden! (" + PackageName + " = " + FileToBeDepackagedPath + ")"

ReadString2(PackageFile)
Local groessederdatei = ReadInt(PackageFile)

Local I
Local DepackagedFile = WriteFile(extractto)

DebugLog "Datei wird geschrieben in " + extractto

For I = 0 To (groessederdatei)
WriteByte DepackagedFile,ReadByte(PackageFile)
If Eof(PackageFile) Then
Notify "Ein Fehler ist aufgetreten, es kann sein, das die Datei nicht korrekt ausgelesen werden konnte!"
Exit
EndIf
Next
DebugLog "Fertig"
CloseFile DepackagedFile
CloseFile PackageFile
End Function

er ist das gegenstück von diesem Code:
BlitzMax: [AUSKLAPPEN]
Function SavePackage(PackageFilePath:String, FileToBePackagedPath:String) 'FUNKTIONIERT!

DebugLog "SavePackage übergebene Parameter: " + PackageFilePath + ", " + FileToBePackagedPath + ""

Local FileToBePackaged = ReadFile(FileToBePackagedPath)

Local SizeOfFileToBePackaged = FileSize(FileToBePackagedPath)
DebugLog "SizeOfFileToBePackaged = " + SizeOfFileToBePackaged

If FileToBePackagedPath <> "" Or SizeOfFileToBePackaged > -1 Then

Local FileToBePackagedName:String = StripDir(FileToBePackagedPath)

Local PackageFile

If FileType(PackageFilePath) = 1
PackageFile = OpenFile(PackageFilePath)

Local SizeOfPackage = FileSize(PackageFilePath)
Local kontrolle = 0
SeekStream(PackageFile, SizeOfPackage)
Else
PackageFile = WriteFile(PackageFilePath)
EndIf

WriteString2(PackageFile, FileToBePackagedName)
WriteInt PackageFile, SizeOfFileToBePackaged

For I = 0 To SizeOfFileToBePackaged - 1
WriteByte PackageFile, ReadByte(FileToBePackaged)
Next

CloseFile PackageFile
If FileToBePackaged <> Null Then
CloseFile FileToBePackaged
EndIf
Else
DebugLog "Speichern von Datei beendet!"
EndIf

End Function
.

Nun habe ich folgendes Problem: Wenn ich 3 Dateien mit SavePackage() in eine Datei zusammenfasse, und dann mit LoadPackage() die 1. datei auslesen will, ließt er die 2. Datei aus. Wenn ich die 2. Datei auslesen möchte, ließt er die 3. aus, Wenn ich die 3. auslesen will, gibts einen Error. D.h. Die Dateiname-Suchfunktion in der LoadPackage() funktion ist fehlerhaft und stoppt den suchvorgang erst exakt eine Datei nach der erforderten. Ich habe schon folgendes Probiert um das Problem zu beheben:
Arrow Eine Schleifen machen, die den Dateinamen sucht und eine variable erhöht, die später als sprungvariable benutzt wird, danach stream schließen und mit neuer variable wieder öffnen, um dann mit seekstream() und der variablen, die eben erhöht wurde an die entsprechende stelle zu springen, ergebnis: Error oder die Datei wurde falsch ausgelesen

Nun könnte ich mir noch vorstellen, das ich einfach die größe der vorher ausgelesenen Datei auslese, und dann einfach die Anzahl an Bytes "zurückspringe", dabei weiß ich allerdings nicht, ob es einen solchen befehl gibt, der in einer datei Bytes zurückgehen kann.

ich hoffe ihr könnt mir helfen,
mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am So, Aug 14, 2011 3:45, insgesamt einmal bearbeitet

kittomer

BeitragSa, Aug 13, 2011 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin gerade nicht so ganz auf der höhe, aber so wie's aussieht, passiert das deswegen, weil du das mit Repeat...Until machst, da die Kondition "PackageName = FileToBeDepackagedPath" erst am ende der Schleife geprüft wird, und da bist du dann schon über die Daten des ersten Files drüber gerollt.

Midimaster

BeitragSa, Aug 13, 2011 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe dazu drei Fragen:

Wieso liest du den die gepackte Datei zweimal in der Load-Routine?

Was steckt hiner der Routine ReadString2() ???

Ist der Code komplett von dir, oder aus einem Code-Archiv?
 

CO2

ehemals "SirMO"

BeitragSo, Aug 14, 2011 3:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@ kittomer: Das ist das Problem, was ich die ganze zeit zu lösen versuche Wink
@ Midimaster: Der Grundcode ist von mir, verbessert wurde er von diversen (man verzeihe mir, das ich mir den namen nicht merken kann) leuten hier im forum verbessert, um danach von mir modifiziert zu werden Wink
Readstring2() ist einfach die übersetzte funktion zu BMax aus BB (ReadString()), das musste ich umschreiben, da es in BMax nicht die selbe funktion gibt wie in BB (bzw. sie macht nicht das selbe, wie die in BB). Das war jedoch das Problem bei dem Programm, für den diese Funktionen gedacht waren, theoretisch könnte man ReadString2() durch das ReadString() aus BMax ersetzen Wink )
Zitat:
Wieso liest du den die gepackte Datei zweimal in der Load-Routine?
Wie meinst du das??
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Midimaster

BeitragSo, Aug 14, 2011 3:33
Antworten mit Zitat
Benutzer-Profile anzeigen
also, was ich da sehe ist, dass nach dem ersten REPEAT nicht nur die Header-Dateien eingelesen werden, sondern auch noch die Daten mit der 2. REPEAT-Schleife

Vielleicht check ich es ja nicht... aber danach steht doch der Filepointer schon hinter den Daten, oder?

Dann kommt diese onimöse ReadString2(PackageFile), die scheinbar schon wieder Daten einliest und danach komt die Schreibroutine, die jetzt versucht, byteweise Daten aus dem noch immer geöffneten Package zu holen. Der Filepointer steht aber doch schon am Anfang des nächsten Abschnitts...

Ich hab das mal was rausgelassen und einige Zeilen mit kommentaren versehen:

BlitzMax: [AUSKLAPPEN]
Function LoadPackage(PackageFilePath:String, FileToBeDepackagedPath:String, extractto:String) 'FUNKTIONIERT

DebugLog "LoadPackage übergebene Parameter: " + PackageFilePath + ", " + FileToBeDepackagedPath + ", " + extractto + ""

Local PackageFile = ReadFile(PackageFilePath)
DebugLog "Package geöffnet!"
If PackageFile = 0 Then
Return 0
EndIf

Local PackageName:String
Local PackageSize:Int
Local PackagePos:Int = 0

Repeat
If Eof(PackageFile) Then
Return 0
EndIf

PackageName = ReadString2(PackageFile)
PackageSize = ReadInt(PackageFile) ' !!!! da hast du doch schon die größe
' jetzt aber raus!

DebugLog "PackageName = " + PackageName + ", PackageSize = " + PackageSize
If PackageName = FileToBeDepackagedPath Exit
kontrolle = 0
Repeat
ReadByte(PackageFile)
kontrolle = kontrolle + 1
Until kontrolle = PackageSize

Until PackageName = FileToBeDepackagedPath
DebugLog "Datei gefunden! (" + PackageName + " = " + FileToBeDepackagedPath + ")"

' ReadString2(PackageFile) ???? was macht die ????

' Local groessederdatei = ReadInt(PackageFile) ' ???schon wieder doppelt gemoppelt

Local I
Local DepackagedFile = WriteFile(extractto)

DebugLog "Datei wird geschrieben in " + extractto

For I = 0 To (groessederdatei) ' ???? die Größe steht doch in PackageSize ????
WriteByte DepackagedFile,ReadByte(PackageFile)
If Eof(PackageFile) Then
Notify "Ein Fehler ist aufgetreten, es kann sein, das die Datei nicht korrekt ausgelesen werden konnte!"
Exit
EndIf
Next
DebugLog "Fertig"
CloseFile DepackagedFile
CloseFile PackageFile
End Function
  • Zuletzt bearbeitet von Midimaster am So, Aug 14, 2011 3:52, insgesamt 2-mal bearbeitet
 

CO2

ehemals "SirMO"

BeitragSo, Aug 14, 2011 3:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, habe das Problem nun gelöst! Hier die funktionierende Funktion:
BlitzMax: [AUSKLAPPEN]
Function LoadPackage(PackageFilePath:String, FileToBeDepackagedPath:String, extractto:String) 'FUNKTIONIERT

DebugLog "LoadPackage übergebene Parameter: " + PackageFilePath + ", " + FileToBeDepackagedPath + ", " + extractto + ""

Local PackageFile = ReadFile(PackageFilePath)
DebugLog "Package geöffnet!"
If PackageFile = 0 Then
Return 0
EndIf

Local PackageName:String
Local PackageSize:Int
Local PackagePos:Int = 0

Repeat
If Eof(PackageFile) Then
Return 0
EndIf

PackageName = ReadString2(PackageFile)
If PackageName = FileToBeDepackagedPath Then
Exit
Else
PackageSize = ReadInt(PackageFile)
DebugLog "PackageName = " + PackageName + ", PackageSize = " + PackageSize
kontrolle = 0
Repeat
ReadByte(PackageFile)
kontrolle = kontrolle + 1
Until kontrolle = PackageSize
EndIf
Until Eof(PackageFile)
DebugLog "Datei gefunden! (" + PackageName + " = " + FileToBeDepackagedPath + ")"

Local groessederdatei = ReadInt(PackageFile)

Local I
Local DepackagedFile = WriteFile(extractto)

DebugLog "Datei wird geschrieben in " + extractto

For I = 0 To (groessederdatei - 1)
WriteByte DepackagedFile,ReadByte(PackageFile)
If Eof(PackageFile) Then
Notify "Ein Fehler ist aufgetreten, es kann sein, das die Datei nicht korrekt ausgelesen werden konnte!"
Exit
EndIf
Next
DebugLog "Fertig"
CloseFile DepackagedFile
CloseFile PackageFile
End Function


mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group