Loading Files at Runtime

Monkey Forums/Monkey Programming/Loading Files at Runtime

SHiLLSiT(Posted 2014) [#1]
Is there a way to load files during run-time? I just want to have the ability to do so when designing levels/UI so I can see the changes without having to recompile.


marksibly(Posted 2014) [#2]
Take a look at DataBuffer.Load.

Depending on the target, you can also use FileStream.

The APIs section of the docs is a pretty good quick reference for finding 'how do I?' stuff like this.


SHiLLSiT(Posted 2014) [#3]
I was playing with this but couldn't seem to get it to load properly. Does it only accept .bin files? Here's what I was doing:

// I'm passing "monkey://data/chunkDB.xml" as the path parameter. 
Method New (path:String)
	Super.New()
	
	_instances = New StringMap<Graphic>()
	
	Local e:XMLError = New XMLError()
	#if CONFIG="debug"
		
		Local stream:DataStream = New DataStream(DataBuffer.Load(path)) // null error here
		Print("LEN: " + stream.Length)
		Print("DATA: " + stream.ReadString(stream.Length))
		'_xmlData = ParseXML(_dataBuffer.Load(0), e)
	#else
		_xmlData = ParseXML(LoadString(path), e)
	#end
	If (e.error) Error(e.ToString())
End


As I commented in the code, I'm getting a crash because of a null error.


marksibly(Posted 2014) [#4]
What target are you using? This works here on glfw/html5:

Import brl.datastream

Function Main()
	Local stream:=New DataStream( DataBuffer.Load( "monkey://data/test.xml" ) )
	Print stream.ReadByte()
End


Strictly speaking, binary files should have a .bin or .dat extension (or you can use #DATA_FILES+="*.blah"), but since .xml is also a text file type, the file should be recognized anyway.


SHiLLSiT(Posted 2014) [#5]
I'm using Flash - I see on the docs that availability for both DataStream and DataBuffer are "All" so I assume it should work for Flash also?


marksibly(Posted 2014) [#6]
Have you tried my code above?

It works here with flash, so I can only assume there's something else wrong with your code.

It'd help if you could post a runnable sample.


SHiLLSiT(Posted 2014) [#7]
Whoops - operator error. I was changing the wrong path var, heh. Thanks mate!


SHiLLSiT(Posted 2014) [#8]
Hrm while it is running now, I can't seem to get it to reload the new XML file after I've made changes. The class I have this in is huge and contains a lot of irrelevant code, which is why I didn't post it before. But here's what I'm doing now:

Method Added:Void ()
	Super.Added()

	Local e:XMLError = New XMLError()
	#if CONFIG="debug"
		Local stream:DataStream = New DataStream(DataBuffer.Load("monkey://data/" + _path))
		Local raw:String = stream.ReadString(stream.Length)
		_xmlData = ParseXML(raw, e)
		Print(raw)
	#else
		'_xmlData = ParseXML(LoadString(_path), e)
	#end
	If (e.error) Error(e.ToString())
        
        ' SNIP load stuff with xml ...


I've simply setup a hotkey to re-add my UI object, which calls the "Added()" function above. After I've made some changes to the XML and reloaded, I can see that the result of Print(raw) does not reflect the changes I made.


marksibly(Posted 2014) [#9]
Oops, should have mentioned - stuff in data/ is 'baked into' the app.

With Flash, you don't have as many options as other targets - have you tried HttpRequest?

Or perhaps you could develop on glfw target, which gives you full filesystem access etc.


SHiLLSiT(Posted 2014) [#10]
Ah, that would make sense. I haven't tried HttpRequest yet as the docs say its not supported on Flash.


Shinkiro1(Posted 2014) [#11]
LoadString() works on all targets.