-->

Windows temp directory details (Java)

2020-02-13 09:13发布

问题:

I'm writing a program that needs a generic temp folder. I'm trying to find details about the Windows Temp folders. There are two paths that I know about -

  1. In each user directory under AppData\Local\Temp\ This may change depending Windows version?

  2. In the system folder under Temp\ (C:\Windows\Temp)

I'm wondering exactly what Windows does to each of these. If Windows deletes files from either location, when does it do so? How can/should I use these directories for my programming?

EDIT: I have a bigger problem actually - Because of a certain engine I'm running indirectly with my program, which uses files I'm creating in a temp directory, I need a temp directory that doesn't use whitespace characters in the path. Java's System.getProperty("java.io.tmpdir") on Windows gives me the temp that's in the user directory, which on XP is under "Documents and Settings..." Not good. Any suggestions? This is why I'm wondering about the C:\Windows\Temp\ directory...

回答1:

Not quite. There is a user and system folder, the default location of which varies according the windows version, system folder name, and indeed in older versions of windows was the same for both the user and system case. However, these defaults can be over-ridden (they are on the system I'm using now, where they aren't on the same drive as the system folder).

The locations are stored in system variables. Some frameworks (.NET, VB6 and no doubt others) give you convient ways to find the paths rather than having to look up the system variable (e.g. System.IO.Path.GetTempPath in .NET).

Windows does not clean up the temporary folder for you (which is why it's worth blasting out old files it every few months on your own machine), it's up to you to play nice. Create a file or files unlikely to step on the names any other software is using (they should take care to do the same, and so any name should do, but it's always good to assume the worse of other code on the system), and delete files when you're done (or on application exit at least).

In .NET System.IO.Path.GetTempFileName() will create a new file in the temp area and return the name of it to you, that is reasonably guaranteed not to conflict with others' so use that or similar methods if you can.



回答2:

This will give you the path to the windows temp directory in Java.

File.createTempFile("temp-file", "tmp").getParent()


回答3:

It sounds like you have two programs that need to share temp files and one definitely doesn't want spaces in the path name. Probably the easiest thing to do is:

  1. set the TMP and TEMP variable to a common directory
  2. launch each application (from this modified environment) - which should pick up the temp variable

So at the command prompt you could do this:

  1. set TMP=c:\mytemp
  2. set TEMP=c:\mytemp
  3. java -cp x;y;z my.application.Entry
  4. run other application (hopefully it also reads the environment for temp/tmp)

Hope that helps.



回答4:

To answer part of your question - if you're using .NET, you can use the Path.GetTempPath() method of the System.IO namespace to get the location of the temporary directory.

// Get the path of the temporary directory
string tempDir = Path.GetTempPath();

// "Creates a uniquely named, zero-byte temporary file on disk and returns the full path of that file."
string tempFile = Path.GetTempFileName();


回答5:

The %TEMP% environment variable that's defined on my PC (XP SP3) uses the DOS-style abcdef~1 directory names - hence, if you can pull that variable, you should end up with a path without spaces.

e.g. Start>Run>%TEMP% takes me to C:\DOCUME~1\<user>\LOCALS~1\Temp

However, if a 'super-user' fiddles around with that variable and points it somewhere else, it's possible that things will fall over. You could look at something like this to retrieve the 8-char-and-no-spaces path.



回答6:

use this code

   try {    String s=File.createTempFile("temp-file", "tmp").getParent();
            System.out.println(s);

        } catch (IOException ex) {
            Logger. getLogger(Result.class.getName()).log(Level.SEVERE, null, ex);
            }


回答7:

you can try this way

System.out.println(File.createTempFile("temp-file", "tmp").getParent());
String property = "java.io.tmpdir";
String tempDir = System.getProperty(property);
System.out.println("OS current temporary directory is " + tempDir);