Find user independent TEMP directory with Java

6.2k views Asked by At

when running a Java application as service with the user 'LocalService', the temp directory ("java.io.tmpdir") points to 'c:/windows/temp' (for example).

Running a Java application normally gives 'c:/documents and settings/user/local settings/temp' instead.

How can I determine the user independent temp folder 'c:/windows/temp' when my application runs normally?

Thanks and greetings, GHad

4

There are 4 answers

6
AudioBubble On BEST ANSWER

You could:

  • as suggested by St Shadow, rely on some environment variable such as %WINDIR% or %SYSTEMROOT%, append "\temp" on the end, and use this.
  • or pass in this value to your app as a variable using a commandline argument to the JVM, e.g.

    -Dmytempdir=%WINDIR%\temp

As you mention, the user could change the values of either of these variables using System -> Environment Variables, but I don't think they'd have any affect on the system until a reboot anyway (...?).

Or...

  • try and read the value from the registry using some nasty use of java.util.prefs.Preferences or something -- On my machine it looks like the value you're after is held in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\TEMP.

This would likely have to be quite messy and I don't know if the Preferences class will get you access to the key you'd need to read. Again, there's not much you could do about the user changing the registry value either, if they really wanted to, but again I doubt it would have any affect until after a reboot, and would probably have an impact on more than just your app.

Cheers, --J

3
St.Shadow On

Java system property java.io.tmpdir just point to system variable %TMP%. For normal user %TMP% points to %HOMEPATH%\temp, for other account - can be another path. You can try to use %SYSTEMROOT%\temp instead of java.io.tmpdir - %SYSTEMROOT% points to directory, where windows is installed.

1
AudioBubble On

I'm not sure there is a 'clean' way of doing this.

In this situation, I would probably create a directory specifically for the Java app and refer to it in a properties file.

2
Lastnico On

You can simply create your own temporary folder, add use the deleteOnExit() method to ensure this folder will be removed at the exit of your application.