os module to save to user's directory
Monkey Targets Forums/Desktop/os module to save to user's directory
| ||
Two of my major needs for monkey glfw, in-app fullscreen/windowed switching, and in-app resolution changes, look like they're addressed in v72a thanks to Mark and Skn3's work - hurrah! My third glfw must-have is the ability to read/write files in the "approved" user directories in Windows and OS X. It's looking like this may be possible via the os module and environment variables. The following seems to work in OS 10.7.5, Windows 7 and Windows Vista SP2 for me, and I can verify that test.dat is showin up in the right place: Import mojo Import os Import brl Class MyApp Extends App Field userDir:String Field fileSavePath:String Field configFilePath:String Field theInt:Int Method OnCreate() SetUpdateRate 30 'USER DIRECTORY FOR SAVE FILES '----------------------- 'Get user data path #If TARGET="glfw" Then 'Construct this app's data paths If HostOS() = "macos" userDir = GetEnv("HOME") fileSavePath = userDir + "/Library/Application Support/MyFileTestApp" configFilePath = fileSavePath + "/test.dat" Elseif HostOS() = "winnt" userDir = GetEnv("APPDATA") fileSavePath = userDir + "\MyFileTestApp" configFilePath = fileSavePath + "\test.dat" Endif Print "filesave directory is :" + fileSavePath Print "config file path is :" + configFilePath 'See if directory exists, if not, create it 'os.monkey has no DirExists function, so instead check for existence of default file 'if default file not there, create directory and create default file Local file:=FileStream.Open(configFilePath,"r") If Not file ' Create New directory CreateDir(fileSavePath) ' Create blank file Local nfile:=FileStream.Open(configFilePath,"w") nfile.WriteInt 0 nfile.Close Else file.Close Endif #Endif End Method OnUpdate() If KeyHit(KEY_LEFT) theInt -=1 If KeyHit(KEY_RIGHT) theInt +=1 If KeyHit(KEY_L) Print "attempting to open file" Local file:=FileStream.Open(configFilePath,"r") If Not file Then Return theInt = file.ReadInt() Print "First int in file is :" + theInt file.Close Endif If KeyHit(KEY_S) Print "attempting to save to file" Local file:=FileStream.Open(configFilePath,"w") If Not file Then Return file.Seek(0) file.WriteInt theInt file.Close Endif End Method OnRender() Cls DrawText "Left arrow to decreases theInt, Right arrow to increase",0,12 DrawText "L To load theInt's value, S to save it",0,24 DrawText "theInt = "+ theInt,0,36 End End Function Main() New MyApp End Any pitfalls to this method? Someone on stackoverflow warned that the HOME var was no available to OS X gui apps, only to apps launched via the console, but this does not seem the case with monkey-made apps. APPDATA is supposed to be valid for Win XP, Vista and 7 (don't know about 8). HOME should be valid for all OS X versions, afaik... |
| ||
Looks good to me. Glfw apps on MacOS X are really console apps I believe, so that's why HOME env var works. You can also use FileType( path ) to check if a dir exists. |
| ||
Should SaveState()/LoadState do this automatically on those platforms? XNA for Windows seems like it could work the same way. Does Win8 on PC have rules for its data files? |
| ||
Great stuff, saves to "C:\Users\*USERNAME*\AppData\Roaming\" Tested on Windows 8 |
| ||
This is wrong for Mac OS-X and sanboxed apps. Data needs to be saved on "~/Library/Containers/<bundle_id>/Data/Library/Application Support/<app_name>/" (*very ugly*, I know, but its what Apple's docs say about it) With the code above, as soon as you check "sandbox mode" into XCode, the app will crash. Edit: Nevermind, GetEnv("HOME") return the correct path... but my game is still crashing, I don't know why :( |