WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   VB - das ENDE einer Datei lesen.... (http://www.wcm.at/forum/showthread.php?t=92162)

renew 24.03.2003 20:57

VB - das ENDE einer Datei lesen....
 
Ich würd von einigen Dateien immer nur das Ende der Datei brauchen (letzten 128-bit einer MP3 Datei).
Ich hab mir das ganze jetzt nur mal Testweise angeschaut, und es einfach als Textdatei geöffnet, dann alles Zeilen durchgelesen und immer wieder abgespeichert.

Und dann von der letzten Zeile einfach die letzten 128 Zeichen genommen.

Nur is das von der Performance net unbedingt gerade das was ich mir vorstelle.

Gibts da eine Möglichkeit direkt das Ende einer Datei zu lesen?

aja, und hier noch schnell mein Beispielcode, wie ich das ganze nur mal kurz ausprobiert hab:
Code:

laenge = 0

Set filesys = CreateObject("scripting.filesystemobject")

Set file = filesys.getfile("c:\test.mp3")

Set textstream = file.openastextstream(1, -2)

While Not textstream.atendofstream

    test = textstream.readline
    laenge = Len(test)

Wend

MsgBox laenge
MsgBox Right(test, 128)


renew 24.03.2003 21:08

ajo, nochwas:

ich muss das Ding sicher als Binärdatei öffenen (bin ich grad draufgekommen)

Weil wenn ich die ID3 Tags im Notepad änder kommt a gröberer schas bei der MP3 Datei raus (soundfehler)

allerdings wenn ich das Ding im Hex-Editor aufmach und dort was änder und dann abspeicher, dann funkt des.

Ich nehm mal an, der Hex-Editor wird die von mir eingegeben Strings in Binärwerte umsetzen und dann abspeichern - während Notepad die Binärwerte der Strings als ASCII Zeichen umsetzt und wenn ich dann was ändere er direkt nur ASCII Zeichen und keine Binärwerte dafür einfügt --> schas kommt raus.

Ich hoff das stimmt so, falls ich mich da mit meiner Vermutung vertue, bitte korrigierts mich, bin bei Binärdateien noch sehr, sehr unerfahren. ;)

flinx 24.03.2003 22:17

Lösung hab ich keine, aber vielleicht hilft der Source von http://phelix.sathack.com/source/

Sesa_Mina 25.03.2003 00:26

mal ganz simpel...

Code:

Open "mymp3.mp3" For Binary As #1 Len = 1
FLen = LOF(1)
T = Space$(FLen)
Get #1, , T
Close #1
ID3Tag = Right$(T, 128)

Somit hast die letzten 128 byte des files isoliert.

dann änderst die.

dann...

Code:

Open "mymp3.mp3" For Binary As #1 Len = 1
Put #1,FLen-128,ID3Tag
close #1

und schon is der modifizierte tag wieder im file drin.

Alles klar?


Und zum Aufbau des tags fragst ambesten mal g00gle.

mst547 25.03.2003 13:24

Notepad
 
Noch mal zu Notepad:
Dieses Phänomen kenne ich auch, wenn man im Notepad Binär-Dateien ändert, funktioniert das nicht mehr. Ich bin draufgekommen, dass Notepad beim Abspeichern (oder schon beim Einlesen?) alle 0-Zeichen (ASCII-Code 0), die ja in binären Dateien vorkommen, durch ein Leerzeichen ersetzt. Die binären Daten werden dadurch für das andere Programm (das die entsprechende Datei normalerweise öffnet) nicht mehr lesbar.

renew 25.03.2003 13:51

Zitat:

Original geschrieben von Sesa_Mina
mal ganz simpel...

Code:

Open "mymp3.mp3" For Binary As #1 Len = 1
FLen = LOF(1)
T = Space$(FLen)
Get #1, , T
Close #1
ID3Tag = Right$(T, 128)

Somit hast die letzten 128 byte des files isoliert.

dann änderst die.

dann...

Code:

Open "mymp3.mp3" For Binary As #1 Len = 1
Put #1,FLen-128,ID3Tag
close #1

und schon is der modifizierte tag wieder im file drin.

Alles klar?


Und zum Aufbau des tags fragst ambesten mal g00gle.

thx - hört sich sehr gut an.

ID3 weiß ich schon wie die ausschauen, und da werd ich sicher noch was finden, falls ich noch Infos brauche. :D

@mst547

danke, das bestätigt das was ich mir gedacht habe. :)

renew 08.04.2003 18:40

Zitat:

Original geschrieben von Sesa_Mina
mal ganz simpel...

Code:

Open "mymp3.mp3" For Binary As #1 Len = 1
FLen = LOF(1)
T = Space$(FLen)
Get #1, , T
Close #1
ID3Tag = Right$(T, 128)

Somit hast die letzten 128 byte des files isoliert.

dann änderst die.

dann...

Code:

Open "mymp3.mp3" For Binary As #1 Len = 1
Put #1,FLen-128,ID3Tag
close #1

und schon is der modifizierte tag wieder im file drin.

Alles klar?


Und zum Aufbau des tags fragst ambesten mal g00gle.

heut bin ich endlich dazu gekommen, mir das ganze anzusehen...

Nur funkts leider nicht!! ;)

Bekomm folgende Fehlermeldung:
Zitat:

Laufzeitfehler 458

Variable verwendet einen in Visual Basic nicht unterstützten Typ der Automatisierung
Der Fehler kommt genau in der Zeile vom Get #1, , T.

Sesa_Mina 08.04.2003 18:48

Dann probier

Get #1,0,T

die 0 gibt hierbei die "record-position" im file an.

Mit Open .. for binary as #1 LEN=1 wird die record länge auf 1 byte gesetzt.

renew 08.04.2003 19:00

Zitat:

Original geschrieben von Sesa_Mina
Dann probier

Get #1,0,T

die 0 gibt hierbei die "record-position" im file an.

Mit Open .. for binary as #1 LEN=1 wird die record länge auf 1 byte gesetzt.

ja danke - das hab ich noch nicht versucht.

Ich hab dann heute die e-books gewälzt und mir das ganze schon raus gesucht.

Was mir aber eher als unlogisch vor kommt, wie bekommst du das ganze file, wenn du die records länge auf 1 byte setzt, und dann nur einmal mittels Get einliest? Dann bekommst doch nur 1 byte in die Variable - oder?

Sesa_Mina 08.04.2003 19:12

mit

T = Space$(FLen)

schreibe ich einen leerstring in die Variable welcher der exakten Dateilänge entspricht.

Dadurch wird per Get das ganze file eingelesen.

Wenn du nur T = Space$(1000) schreiben würdest, hättest du nach dem Get befehl nur die ersten 1000 bytes in der Variable.

Danach müsstest du mit Get #1,1000,T die nächsten 1000 byte lesen und dann mit Get #1,2000,T die nächsten usw.

renew 08.04.2003 19:32

Zitat:

Original geschrieben von Sesa_Mina
mit

T = Space$(FLen)

schreibe ich einen leerstring in die Variable welcher der exakten Dateilänge entspricht.

Dadurch wird per Get das ganze file eingelesen.

Wenn du nur T = Space$(1000) schreiben würdest, hättest du nach dem Get befehl nur die ersten 1000 bytes in der Variable.

Danach müsstest du mit Get #1,1000,T die nächsten 1000 byte lesen und dann mit Get #1,2000,T die nächsten usw.

aso is des...

Und ich hab mich schon gewundert was das bringen soll. ;) Das einzige was ich mir vielleicht gedacht hab is, dass du den String dadurch schon auf die richtige Größe im Speicher allokierst.

Und was bringt es dann, die Schrittweite beim öffnen des Files anzugeben?

Sesa_Mina 08.04.2003 22:13

Code:

Type MyRecord
  Name as String * 20  (k.A. ob ich das mit der fixen Länge
  Alter as Byte        hier richtig hab...)
End Type

Dim User as MyRecord

Damit hast ne Variable mit einer ganz bestimmten Länge

Damit du nun mit GET immer einen record nach dem anderen einlesen kannst ohne umständlich die Position im file zu berechnen kannst du beim binörmode eine Record-Länge angeben.

Code:

Open ... for Binary as #1 Len=21
Ich sag jetzt mal oben angegebene Variable benötigt 21 Byte platz. 20 Byte für den Namen und 1 Byte für das Alter.

Mit
Code:

Get #1,0,User
liest du jetzt den ersten Satz ein.

Mit
Code:

Get #1,100,User
liest du den 101 Satz ein.

Hierbei ist jeder gelesene Record genau die 21 Byte groß. Du liest also in 21 Byte Schritten.

Wäre User jetzt 42 byte groß, würdest er genau 2 Sätzen platz bieten und es würden auch 2 gelesen werden.

Wenn du Len=1 angibst, setzt du die Record-Länge auf 1 Byte und kannst somit byteweise aus dem file lesen bzw. das ganze file auf einmal einlesen wenn du Get eine Variable übergibst die groß genug ist um den gesamten Inhalt (alle "Sätze") zu fassen.

renew 08.04.2003 22:39

Zitat:

Original geschrieben von Sesa_Mina
Code:

Type MyRecord
  Name as String * 20  (k.A. ob ich das mit der fixen Länge
  Alter as Byte        hier richtig hab...)
End Type

Dim User as MyRecord

Damit hast ne Variable mit einer ganz bestimmten Länge

Damit du nun mit GET immer einen record nach dem anderen einlesen kannst ohne umständlich die Position im file zu berechnen kannst du beim binörmode eine Record-Länge angeben.

Code:

Open ... for Binary as #1 Len=21
Ich sag jetzt mal oben angegebene Variable benötigt 21 Byte platz. 20 Byte für den Namen und 1 Byte für das Alter.

Mit
Code:

Get #1,0,User
liest du jetzt den ersten Satz ein.

Mit
Code:

Get #1,100,User
liest du den 101 Satz ein.

Hierbei ist jeder gelesene Record genau die 21 Byte groß. Du liest also in 21 Byte Schritten.

Wäre User jetzt 42 byte groß, würdest er genau 2 Sätzen platz bieten und es würden auch 2 gelesen werden.

Wenn du Len=1 angibst, setzt du die Record-Länge auf 1 Byte und kannst somit byteweise aus dem file lesen bzw. das ganze file auf einmal einlesen wenn du Get eine Variable übergibst die groß genug ist um den gesamten Inhalt (alle "Sätze") zu fassen.

supa danke - sehr nett erklärt. :)
Das hat MS ja wirklich logisch gemacht, dass man des so einlesen kann.

Jetzt muss ich nur noch schaun, dass ich das mit meinen Files hin bekomm.

Ich weiß zwar noch nicht wann ich wieder dazu komm, da langsam der Matura-Stress beginnen könnte, aber falls es wieder was zu dem Thema gibt, werd ich den Thread wieder "aufwärmen". ;)

renew 09.04.2003 21:47

hmm, Käse. ;)

Des will mir nicht gelingen. So wie du es geschrieben hast stimmt es schon - hab mich ja selber ein wenig in die Materie mit Binär-Files eingelesen.

Hab mir auch eine Funktion gebastelt die mir 3 Werte einfach mittels PUT in ein File schreibt. (3x PUT hintereinander)

Funktioniert auch - und aus diesem File kann ich auch lesen (mit GET).
Das einzige was komisch ist, wenn ich mit deinem Code (also auch mit dem LOF usw...) an diese Datei gehe, bekomme ich aber auch nur den ersten Wert, der mit PUT raus geschrieben wurde.
Aber das nur nebenbei erwähnt.

Wenn ich aber eine andere Datei - egal welche auswähle (Bitmap, MP3,....) bekomm ich den oben zitierten Runtime-Error.
Sehe ich aber irgendwie unlogisch, da ja alles diese Files Binärdateien sind.

Und noch was fällt mir auf: wenn ich mittels meiner kleinen "Test-PUT-Funktion" einen String in eine Datei raus schreibe (z.B 11 Zeichen), dann hat das File aber nicht 11bytes sondern 15 - es sind noch 4 bytes davor, bevor der eigentlich String kommt (irgendwelche Steuerzeichen - oder was weiß ich)
Der String wurde aber nur mittels einem PUT raus geschrieben. Verwende ich mehrere PUTs hintereinander, sind zwischen den einzelnen "Datensätzen" die raus geschrieben werden auch nochmals Steuerzeichen!?

Gibts dafür eine Erklärung - und wie man das ganze umgehen kann?

Sesa_Mina 09.04.2003 21:49

hmm.. das is komisch...


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag