Disk Pointer?

BlitzMax Forums/BlitzMax Programming/Disk Pointer?

Retimer(Posted 2008) [#1]
This may not make any sense at all, please bear with me.

Is there a way to read x amount of data from a specific pointer (on a disk) if you know exactly where the data is on the hard drive without referring to a file?

For example:

Instead of:
Loadbank(<File>)

this type of idea:
Loadbank(<Disk Pointer address>,<length>)

It would basically be the same as opening a file, but instead, opening an undefined file (just a chunk of memory on the drive).

Possible?


Vilu(Posted 2008) [#2]
I guess the only possible way is through the Windows API:

http://support.microsoft.com/kb/100027

Sorry, don't have an example to throw in ;)


Retimer(Posted 2008) [#3]
Nice find, i'll look into it more. Thanks =)


ImaginaryHuman(Posted 2008) [#4]
Yes there is nothing in BlitzMax to work with disk data directly. You only have file access. To look at the disk `itself` and read the file system yourself or even go below the filesystem you're going to have to use the os's API for low level disk access.


Retimer(Posted 2008) [#5]
Thanks for the reply

It's looking pretty complicated, at least a lot more complicated then I was hoping for especially for trying to set up a module for cross platform with this, but I should be able to figure something out.

One problem I can forsee: how would I take the data that I read and return it as a loadable object? Or is this only possible in BM with streams/banks/urls?

Streams 'almost' do the trick when loading a file containing multiple data files when you seek to the desired data position, then loading it:


Local Stream:TStream = openstream("c:\test.pak")
Stream.seek(1663) 'Second file (image) located here.

Local Image:Timage = loadimage(Stream)



Which loads the stream from that position. The only thing missing from that is setting the length.
The reason I don't just ReadBytes or MemCopy or CopyBank to a seperate bank/stream is because that shows a huge slowdown compared to opening the data file by itself rather then in a package.

In an unrealistic test of a 70mb file, it takes at least 50% longer to copy the bytes over to a seperate object then to load the file outside of a package in all the methods ive tried. This is why i'm trying to get this working, sorry I didn't state my reasons before.


Blueapples(Posted 2008) [#6]
Try CreateRamStream... you should be able to create a stream of a limited length within the bank at a given position. This way LoadImage, etc only see the amount of data you want them to.