Concatenating binary files?
Tim Rowledge
tim at sumeru.stanford.edu
Mon Mar 31 21:47:12 UTC 2003
> "Concatenate 2 Wave Files"
> | fileDir wave1 wave2 wave3 file1 file2 file3 |
> fileDir := FileDirectory on: 'C:\Documents and Settings\Jimmie\My
> Documents\My Music\MP3\Alexander Scourby\waves'.
First problem; you should use
FileDirectory default directoryNamed:'C:\Documents and
Settings\Jimmie\My
Documents\My Music\MP3\Alexander Scourby\waves'.
This will get you a proper file directroy for your platform rather than
the generic one. Much more useful.
> file1 := fileDir fullName, '\Genesis 37a.wav'.
Second problem; using strings like this. It will work but it's really
bad practice. After all, there is a fair bit of code already written to
make sure filenames are acceptable. Why work around it?
Use
fileDir fileNamed: 'Genesis.wav'
etc. instead.
> file2 := fileDir fullName, '\Genesis 37b.wav'.
> file3 := fileDir fullName, '\Genesis 37k.wav'.
> wave1 := (StandardFileStream fileNamed: file1) binary.
> wave1 := ReadStream on: wave1 contentsOfEntireFile.
Third problem; why are you makinga ReadStream on the contents of the
file? The stuff is already accesible from the file stream and if it is
a big file you will rapidly run out of memory.
> wave2 := (StandardFileStream fileNamed: file2) binary.
> wave2 := ReadStream on: wave2 contentsOfEntireFile.
> wave3 := (StandardFileStream fileNamed: file3) binary.
> wave3 nextPutAll: wave1.
Fourth problem; you're trying to add a ReadStream to another Stream. You
could get away with 'wave3 nextPutAll: wave1 contents' in most cases.
> wave3 nextPutAll: wave2.
> wave3 flush.
> wave3 close.
> wave2 close.
> wave1 close.
>
Take a look at FileDirectory copyFileNamed:to: to see a similar process.
You might find this more successful:-
| fileDir wave3 wave2 wave1 buffer|
fileDir := FileDirectory default directoryNamed:'C:\Documents and
Settings\Jimmie\My
Documents\My Music\MP3\Alexander Scourby\waves'.
wave3 := fileDir fileNamed: 'Genesis 37k.wav'.
wave2 := fileDir oldFileNamed: 'Genesis 37b.wav'.
wave1 := fileDir oldFileNamed: 'Genesis 37a.wav'.
buffer := String new:5000.
wave3 setToEnd.
[wave2 atEnd] whileFalse: [wave3 nextPutAll: (wave2 nextInto: buffer)].
[wave1 atEnd] whileFalse: [wave3 nextPutAll: (wave1 nextInto: buffer)].
wave1 close.
wave2 close.
wave3 close.
WARNING I didn't test this. Left as an exercise for the student.
tim
--
Tim Rowledge, tim at sumeru.stanford.edu, http://sumeru.stanford.edu/tim
Strange OpCodes: TVO: Type Various Obscenities
More information about the Squeak-dev
mailing list
|