зеркало из https://github.com/mozilla/pjs.git
159 строки
4.3 KiB
Java
159 строки
4.3 KiB
Java
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil -*-
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License
|
|
* Version 1.0 (the "License"); you may not use this file except in
|
|
* compliance with the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS"
|
|
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
|
* the License for the specific language governing rights and limitations
|
|
* under the License.
|
|
*
|
|
* The Original Code is the Grendel mail/news client.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape Communications
|
|
* Corporation. Portions created by Netscape are Copyright (C) 1997
|
|
* Netscape Communications Corporation. All Rights Reserved.
|
|
*/
|
|
|
|
package calypso.util;
|
|
|
|
import java.io.*;
|
|
import java.util.*;
|
|
|
|
/**
|
|
* Utility class for generating temporary file names.
|
|
*
|
|
* @author Kipp E.B. Hickman
|
|
*/
|
|
public class TempFile {
|
|
static private boolean gHaveSetFinalizersOnExit;
|
|
static private int gNextID;
|
|
static private Random gGenerator = new Random();
|
|
|
|
String fTempFileName;
|
|
|
|
/**
|
|
* Create a new temporary file name that the calling
|
|
* thread can use that is unique and has the given extension.
|
|
*/
|
|
// XXX need security access check
|
|
static public synchronized TempFile TempName(String aExtension) {
|
|
/* XXX seems to cause jdk1.1.3b to hang...
|
|
if (!gHaveSetFinalizersOnExit) {
|
|
// Make sure temp files get removed on exit
|
|
System.runFinalizersOnExit(true);
|
|
gHaveSetFinalizersOnExit = true;
|
|
}*/
|
|
|
|
// Fix up temp dir to have a trailing separator
|
|
String tmpDir = GetTempDir();
|
|
int tmpDirLen = tmpDir.length();
|
|
if ((tmpDirLen > 0) &&
|
|
(tmpDir.charAt(tmpDirLen - 1) != File.separatorChar)) {
|
|
tmpDir = tmpDir + File.separatorChar;
|
|
SetTempDir(tmpDir);
|
|
}
|
|
|
|
for (;;) {
|
|
int value = gGenerator.nextInt() & 0xffffff;
|
|
String name = tmpDir + "ns" + StringUtils.ToHex(value, 6) + aExtension;
|
|
File file = new File(name);
|
|
if (file.exists()) {
|
|
continue;
|
|
}
|
|
return new TempFile(name);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return the native path name for the system's temporary directory.
|
|
*/
|
|
static final String propertyName = "system.tempdir";
|
|
static public synchronized String GetTempDir() {
|
|
Properties p = System.getProperties();
|
|
String dir = p.getProperty(propertyName);
|
|
if (dir == null) {
|
|
String osname = p.getProperty("os.name");
|
|
if (osname.startsWith("Windows")) {
|
|
dir = "c:\\windows\temp";
|
|
if (TryDirectory(dir)) {
|
|
return dir;
|
|
}
|
|
dir = "c:\\temp";
|
|
if (TryDirectory(dir)) {
|
|
return dir;
|
|
}
|
|
dir = "\temp";
|
|
if (TryDirectory(dir)) {
|
|
return dir;
|
|
}
|
|
dir = "\tmp";
|
|
if (TryDirectory(dir)) {
|
|
return dir;
|
|
}
|
|
// Oh well, fall back to the current directory wherever that is!
|
|
dir = ".";
|
|
if (TryDirectory(dir)) {
|
|
return dir;
|
|
}
|
|
throw new Error("whoops: no windoze tempdir!");
|
|
} else {
|
|
// XXX for now, assume it's unix
|
|
dir = "/tmp";
|
|
if (TryDirectory(dir)) {
|
|
return dir;
|
|
}
|
|
throw new Error("whoops: no unix tempdir!");
|
|
}
|
|
}
|
|
return dir;
|
|
}
|
|
|
|
static private boolean TryDirectory(String aDir) {
|
|
File f = new File(aDir);
|
|
if (f.exists() && f.isDirectory()) {
|
|
SetTempDir(aDir);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Set the native path name for the system's temporary directory.
|
|
*/
|
|
// XXX need security access check
|
|
static public synchronized void SetTempDir(String aDir) {
|
|
Properties p = System.getProperties();
|
|
p.put(propertyName, aDir);
|
|
}
|
|
|
|
protected TempFile(String aName) {
|
|
fTempFileName = aName;
|
|
}
|
|
|
|
public OutputStream create() throws IOException {
|
|
return new BufferedOutputStream(new FileOutputStream(fTempFileName));
|
|
}
|
|
|
|
public OutputStream append() throws IOException {
|
|
return new BufferedOutputStream(new FileOutputStream(fTempFileName, true));
|
|
}
|
|
|
|
public String getName() {
|
|
return fTempFileName;
|
|
}
|
|
|
|
public void delete() {
|
|
if (fTempFileName != null) {
|
|
new File(fTempFileName).delete();
|
|
fTempFileName = null;
|
|
}
|
|
}
|
|
|
|
protected void finalize() {
|
|
delete();
|
|
}
|
|
}
|