You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by nd...@apache.org on 2006/08/18 03:45:39 UTC
svn commit: r432462 [5/21] -
/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/File.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/File.java?rev=432462&r1=432461&r2=432462&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/File.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/File.java Thu Aug 17 18:45:35 2006
@@ -1,1252 +1,1252 @@
-/* Copyright 1998, 2006 The Apache Software Foundation or its licensors, as applicable
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.io;
-
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.security.AccessController;
-
-import org.apache.harmony.luni.util.PriviAction;
-
-/**
- * File is a class which represents a file name or directory. The file may be
- * absolute relative to the root directory of the file system or relative to the
- * current directory in which the program is running.
- * <p>
- * This class provides methods for querying/changing information about the file
- * and also directory listing capabilities if the File represents a directory.
- * <p>
- * When manipulating file paths, the static fields of this class may be used to
- * determine the platform specific separators.
- *
- * @see java.io.Serializable
- * @see java.lang.Comparable
- */
-
-public class File implements Serializable, Comparable<File> {
- private static final long serialVersionUID = 301077366599181567L;
-
- private String path;
-
- byte[] properPath;
-
- /**
- * System dependent file separator character.
- */
- public static final char separatorChar;
-
- /**
- * System dependent file separator String. The initial value of this field
- * is the System property "file.separator".
- */
- public static final String separator;
-
- /**
- * System dependent path separator character.
- */
- public static final char pathSeparatorChar;
-
- /**
- * System dependent path separator String. The initial value of this field
- * is the System property "path.separator".
- */
- public static final String pathSeparator;
-
- /* Temp file counter needs java.util.Random from mJava */
- private static int counter;
-
- private static boolean caseSensitive;
-
- private static native void oneTimeInitialization();
-
- static {
- oneTimeInitialization();
-
- // The default protection domain grants access to these properties
- separatorChar = System.getProperty("file.separator", "\\").charAt(0); //$NON-NLS-1$ //$NON-NLS-2$
- pathSeparatorChar = System.getProperty("path.separator", ";").charAt(0); //$NON-NLS-1$//$NON-NLS-2$
- separator = new String(new char[] { separatorChar }, 0, 1);
- pathSeparator = new String(new char[] { pathSeparatorChar }, 0, 1);
- caseSensitive = isCaseSensitiveImpl();
- }
-
- /**
- * Constructs a new File using the specified directory and name.
- *
- * @param dir
- * the directory for the file name
- * @param name
- * the file name to be contained in the dir
- */
-
- public File(File dir, String name) {
- if (name != null) {
- if (dir == null) {
- this.path = fixSlashes(name);
- } else {
- this.path = calculatePath(dir.getPath(),name);
- }
- } else
- throw new NullPointerException();
- }
-
- /**
- * Constructs a new File using the specified path.
- *
- * @param path
- * the path to be used for the file
- */
- public File(String path) {
- // NullPointerException thrown by fixSlashes
- this.path = fixSlashes(path);
- }
-
- /**
- * Constructs a new File using the specified directory and name placing a
- * path separator between the two.
- *
- * @param dirPath
- * the directory for the file name
- * @param name
- * the file name to be contained in the dir
- */
- public File(String dirPath, String name) {
- if (name != null) {
- if (dirPath == null) {
- this.path = fixSlashes(name);
- } else {
- this.path = calculatePath(dirPath, name);
- }
- } else
- throw new NullPointerException();
- }
-
- /**
- * Constructs a new File using the path of the specified URI
- *
- * <code>uri</code> needs to be an absolute and hierarchical
- * <code>URI </code> with file scheme, and non-empty path component, but
- * with undefined authority, query or fragment components.
- *
- * @param uri
- * the URI instance which will be used to construct this file
- *
- * @throws IllegalArgumentException
- * if <code>uri</code> does not comply with the conditions
- * above.
- *
- * @see #toURI
- * @see java.net.URI
- */
- public File(URI uri) {
- // check pre-conditions
- checkURI(uri);
- this.path = fixSlashes(uri.getPath());
- }
-
- private String calculatePath(String dirPath, String name) {
- // Remove all the proceeding separator chars from name
- name = fixSlashes(name);
- while (name.length() > 0 && (name.charAt(0) == separatorChar))
- name = name.substring(1, name.length());
-
- // Ensure there is a separator char between dirPath and name
- dirPath = fixSlashes(dirPath);
- if (dirPath.length() > 0 && (dirPath.charAt(dirPath.length() - 1) == separatorChar)) {
- return dirPath + name;
- }
-
- return dirPath + separatorChar + name;
- }
-
- private void checkURI(URI uri) {
- if (!uri.isAbsolute()) {
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
- "K031a", uri)); //$NON-NLS-1$
- } else if (!uri.getRawSchemeSpecificPart().startsWith("/")) { //$NON-NLS-1$
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
- "K031b", uri)); //$NON-NLS-1$
- }
-
- String temp = uri.getScheme();
- if (temp == null || !temp.equals("file")) { //$NON-NLS-1$
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
- "K031c", uri)); //$NON-NLS-1$
- }
-
- temp = uri.getRawPath();
- if (temp == null || temp.length() == 0) {
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
- "K031d", uri)); //$NON-NLS-1$
- }
-
- if (uri.getRawAuthority() != null) {
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
- "K031e", new String[] { "authority", uri.toString() })); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- if (uri.getRawQuery() != null)
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
- "K031e", new String[] { "query", uri.toString() })); //$NON-NLS-1$//$NON-NLS-2$
-
- if (uri.getRawFragment() != null)
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
- "K031e", new String[] { "fragment", uri.toString() })); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- private static native byte[][] rootsImpl();
-
- private static native boolean isCaseSensitiveImpl();
-
- /**
- * Lists the filesystem roots.
- *
- * The Java platform may support zero or more filesystems, each with its own
- * platform-dependent root. Further, the canonical pathname of any file on
- * the system will always begin with one of the returned filesystem roots.
- *
- * @return the array of filesystem roots
- */
- public static File[] listRoots() {
- byte[][] rootsList = rootsImpl();
- if (rootsList == null)
- return new File[0];
- File result[] = new File[rootsList.length];
- for (int i = 0; i < rootsList.length; i++)
- result[i] = new File(org.apache.harmony.luni.util.Util.toString(rootsList[i]));
- return result;
- }
-
- /**
- * The purpose of this method is to take a path and fix the slashes up. This
- * includes changing them all to the current platforms fileSeparator and
- * removing duplicates.
- */
- private String fixSlashes(String origPath) {
- int uncIndex = 1;
- int length = origPath.length(), newLength = 0;
- if (separatorChar == '/') // disable UNC names
- uncIndex = 0;
- else if (length > 2 && origPath.charAt(1) == ':')
- uncIndex = 2;
-
- boolean foundSlash = false;
- char newPath[] = origPath.toCharArray();
- for (int i = 0; i < length; i++) {
- char pathChar = newPath[i];
- if (pathChar == '\\' || pathChar == '/') {
- /* UNC Name requires 2 leading slashes */
- if ((foundSlash && i == uncIndex) || !foundSlash) {
- newPath[newLength++] = separatorChar;
- foundSlash = true;
- }
- } else {
- // check for leading slashes before a drive
- if (pathChar == ':'
- && uncIndex > 0
- && (newLength == 2 || (newLength == 3 && newPath[1] == separatorChar))
- && newPath[0] == separatorChar) {
- newPath[0] = newPath[newLength - 1];
- newLength = 1;
- // allow trailing slash after drive letter
- uncIndex = 2;
- }
- newPath[newLength++] = pathChar;
- foundSlash = false;
- }
- }
- // remove trailing slash
- if (foundSlash
- && (newLength > (uncIndex + 1) || (newLength == 2 && newPath[0] != separatorChar))) {
- newLength--;
- }
- String tempPath = new String(newPath, 0, newLength);
- // If it's the same keep it identical for SecurityManager purposes
- if (!tempPath.equals(origPath)) {
- return tempPath;
- }
- return origPath;
- }
-
- /**
- * Answers a boolean indicating whether or not the current context is allowed
- * to read this File.
- *
- * @return <code>true</code> if this File can be read, <code>false</code>
- * otherwise.
- *
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public boolean canRead() {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- return exists() && !isWriteOnlyImpl(properPath(true));
- }
-
- /**
- * Answers a boolean indicating whether or not the current context is
- * allowed to write to this File.
- *
- * @return <code>true</code> if this File can be written,
- * <code>false</code> otherwise.
- *
- * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
- */
- public boolean canWrite() {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkWrite(path);
-
- // Cannot use exists() since that does an unwanted read-check.
- boolean exists = false;
- if (path.length() > 0) {
- exists = existsImpl(properPath(true));
- }
- return exists && !isReadOnlyImpl(properPath(true));
- }
-
- /**
- * Answers the relative sort ordering of paths for the receiver and given
- * argument. The ordering is platform dependent.
- *
- * @param another
- * a File to compare the receiver to
- * @return an int determined by comparing the two paths. The meaning is
- * described in the Comparable interface.
- * @see Comparable
- */
- public int compareTo(File another) {
- if (caseSensitive) {
- return this.getPath().compareTo(another.getPath());
- }
- return this.getPath().compareToIgnoreCase(another.getPath());
- }
-
- /**
- * Deletes the file specified by this File. Directories must be empty before
- * they will be deleted.
- *
- * @return <code>true</code> if this File was deleted, <code>false</code>
- * otherwise.
- *
- * @see java.lang.SecurityManager#checkDelete
- */
- public boolean delete() {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkDelete(path);
- }
- byte[] propPath = properPath(true);
- if ((path.length() != 0) && isDirectoryImpl(propPath)) {
- return deleteDirImpl(propPath);
- }
- return deleteFileImpl(propPath);
- }
-
- private native boolean deleteDirImpl(byte[] filePath);
-
- private native boolean deleteFileImpl(byte[] filePath);
-
- /**
- * When the virtual machine terminates, any abstract files which have been
- * sent <code>deleteOnExit()</code> will be deleted. This will only happen
- * when the virtual machine terminates normally as described by the Java
- * Language Specification section 12.9.
- *
- */
- public void deleteOnExit() {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkDelete(path);
-
- org.apache.harmony.luni.util.DeleteOnExit.addFile(org.apache.harmony.luni.util.Util
- .toString(properPath(true)));
- }
-
- /**
- * Compares the argument <code>obj</code> to the receiver, and answers
- * <code>true</code> if they represent the <em>same</em> object using a
- * path specific comparison.
- *
- * @param obj
- * the Object to compare with this Object
- * @return <code>true</code> if the object is the same as this object,
- * <code>false</code> otherwise.
- */
- public boolean equals(Object obj) {
- if (!(obj instanceof File))
- return false;
- if (!caseSensitive) {
- return path.equalsIgnoreCase(((File) obj).getPath());
- }
- return path.equals(((File) obj).getPath());
- }
-
- /**
- * Answers a boolean indicating whether or not this File can be found on the
- * underlying file system.
- *
- * @return <code>true</code> if this File exists, <code>false</code>
- * otherwise.
- *
- * @see #getPath
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public boolean exists() {
- if (path.length() == 0)
- return false;
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- return existsImpl(properPath(true));
- }
-
- private native boolean existsImpl(byte[] filePath);
-
- /**
- * Answers the absolute file path of this File.
- *
- * @return the absolute file path
- *
- * @see java.lang.SecurityManager#checkPropertyAccess
- */
- public String getAbsolutePath() {
- byte[] absolute = properPath(false);
- return org.apache.harmony.luni.util.Util.toString(absolute);
- }
-
- /**
- * Answers a new File constructed using the absolute file path of this File.
- *
- * @return a new File from this absolute file path
- *
- * @see java.lang.SecurityManager#checkPropertyAccess
- */
- public File getAbsoluteFile() {
- return new File(this.getAbsolutePath());
- }
-
- /**
- * Answers the absolute file path of this File with all references resolved.
- * An <em>absolute</em> file path is one which begins at the root of the
- * file system. The canonical path is one in which all references have been
- * resolved. For the cases of '..' and '.' where the file system supports
- * parent and working directory respectively, these should be removed and
- * replaced with a direct directory reference. If the File does not exist,
- * getCanonicalPath() may not resolve any references and simply return an
- * absolute path name or throw an IOException.
- *
- * @return the canonical file path
- *
- * @throws IOException
- * if an IO error occurs
- *
- * @see java.lang.SecurityManager#checkPropertyAccess
- */
- public String getCanonicalPath() throws IOException {
- byte[] result = properPath(false);
-
- boolean exists = false;
- byte[] pathBytes = result;
- do {
- byte[] linkBytes = getLinkImpl(pathBytes);
- if (linkBytes == pathBytes)
- break;
- if (linkBytes[0] == separatorChar) {
- pathBytes = linkBytes;
- } else {
- int index = pathBytes.length - 1;
- while (pathBytes[index] != separatorChar)
- index--;
- byte[] temp = new byte[index + 1 + linkBytes.length];
- System.arraycopy(pathBytes, 0, temp, 0, index + 1);
- System.arraycopy(linkBytes, 0, temp, index + 1,
- linkBytes.length);
- pathBytes = temp;
- }
- exists = existsImpl(pathBytes);
- } while (exists);
- if (exists)
- result = pathBytes;
-
- int numSeparators = 1;
- for (int i = 0; i < result.length; i++)
- if (result[i] == separatorChar)
- numSeparators++;
- int sepLocations[] = new int[numSeparators];
- int rootLoc = 0;
- if (separatorChar != '/')
- if (result[0] == '\\')
- rootLoc = (result.length > 1 && result[1] == '\\') ? 1 : 0;
- else
- rootLoc = 2; // skip drive i.e. c:
- byte newResult[] = new byte[result.length + 1];
- int newLength = 0, lastSlash = 0, foundDots = 0;
- sepLocations[lastSlash] = rootLoc;
- for (int i = 0; i <= result.length; i++) {
- if (i < rootLoc)
- newResult[newLength++] = result[i];
- else {
- if (i == result.length || result[i] == separatorChar) {
- if (i == result.length && foundDots == 0)
- break;
- if (foundDots == 1) {
- /* Don't write anything, just reset and continue */
- foundDots = 0;
- continue;
- }
- if (foundDots > 1) {
- /* Go back N levels */
- lastSlash = lastSlash > (foundDots - 1) ? lastSlash
- - (foundDots - 1) : 0;
- newLength = sepLocations[lastSlash] + 1;
- foundDots = 0;
- continue;
- }
- sepLocations[++lastSlash] = newLength;
- newResult[newLength++] = (byte) separatorChar;
- continue;
- }
- if (result[i] == '.') {
- foundDots++;
- continue;
- }
- /* Found some dots within text, write them out */
- if (foundDots > 0)
- for (int j = 0; j < foundDots; j++)
- newResult[newLength++] = (byte) '.';
- newResult[newLength++] = result[i];
- foundDots = 0;
- }
- }
- // remove trailing slash
- if (newLength > (rootLoc + 1)
- && newResult[newLength - 1] == separatorChar)
- newLength--;
- newResult[newLength] = 0;
- newResult = getCanonImpl(newResult);
- newLength = newResult.length;
- return org.apache.harmony.luni.util.Util.toString(newResult, 0, newLength);
- }
-
- /**
- * Answers a new File created using the canonical file path of this File.
- * Equivalent to <code>new File(this.getCanonicalPath())</code>.
- *
- * @return the canonical file path
- *
- * @throws IOException
- * If an IO error occurs
- *
- * @see java.lang.SecurityManager#checkPropertyAccess
- */
- public File getCanonicalFile() throws IOException {
- return new File(getCanonicalPath());
- }
-
- private native byte[] getCanonImpl(byte[] filePath);
-
- /**
- * Answers the filename (not directory) of this File.
- *
- * @return the filename or empty string
- */
- public String getName() {
- int separatorIndex = path.lastIndexOf(separator);
- return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1,
- path.length());
- }
-
- /**
- * Answers the pathname of the parent of this File. This is the path up to
- * but not including the last name. <code>null</code> is returned when
- * there is no parent.
- *
- * @return the parent name or <code>null</code>
- */
- public String getParent() {
- int length = path.length(), firstInPath = 0;
- if (separatorChar == '\\' && length > 2 && path.charAt(1) == ':')
- firstInPath = 2;
- int index = path.lastIndexOf(separatorChar);
- if (index == -1 && firstInPath > 0)
- index = 2;
- if (index == -1 || path.charAt(length - 1) == separatorChar)
- return null;
- if (path.indexOf(separatorChar) == index
- && path.charAt(firstInPath) == separatorChar)
- return path.substring(0, index + 1);
- return path.substring(0, index);
- }
-
- /**
- * Answers a new File made from the pathname of the parent of this File.
- * This is the path up to but not including the last name. <code>null</code>
- * is returned when there is no parent.
- *
- * @return a new File representing parent or <code>null</code>
- */
- public File getParentFile() {
- String tempParent = getParent();
- if (tempParent == null)
- return null;
- return new File(tempParent);
- }
-
- /**
- * Answers the file path of this File.
- *
- * @return the file path
- */
- public String getPath() {
- return path;
- }
-
- /**
- * Answers an integer hash code for the receiver. Any two objects which
- * answer <code>true</code> when passed to <code>equals</code> must
- * answer the same value for this method.
- *
- * @return the receiver's hash
- *
- * @see #equals
- */
- public int hashCode() {
- if (caseSensitive)
- return path.hashCode() ^ 1234321;
- else
- return path.toLowerCase().hashCode() ^ 1234321;
- }
-
- /**
- * Answers if this File is an absolute pathname. Whether a pathname is
- * absolute is platform specific. On UNIX it is if the path starts with the
- * character '/', on Windows it is absolute if either it starts with '\',
- * '/', '\\' (to represent a file server), or a letter followed by a colon.
- *
- * @return <code>true</code> if this File is absolute, <code>false</code>
- * otherwise.
- *
- * @see #getPath
- */
- public boolean isAbsolute() {
- return isAbsoluteImpl(org.apache.harmony.luni.util.Util.getBytes(path));
- }
-
- private native boolean isAbsoluteImpl(byte[] filePath);
-
- /**
- * Answers if this File represents a <em>directory</em> on the underlying
- * file system.
- *
- * @return <code>true</code> if this File is a directory,
- * <code>false</code> otherwise.
- *
- * @see #getPath
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public boolean isDirectory() {
- if (path.length() == 0)
- return false;
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- return isDirectoryImpl(properPath(true));
- }
-
- private native boolean isDirectoryImpl(byte[] filePath);
-
- /**
- * Answers if this File represents a <em>file</em> on the underlying file
- * system.
- *
- * @return <code>true</code> if this File is a file, <code>false</code>
- * otherwise.
- *
- * @see #getPath
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public boolean isFile() {
- if (path.length() == 0)
- return false;
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- return isFileImpl(properPath(true));
- }
-
- private native boolean isFileImpl(byte[] filePath);
-
- /**
- * Returns whether or not this file is a hidden file as defined by the
- * operating system.
- *
- * @return <code>true</code> if the file is hidden, <code>false</code>
- * otherwise.
- */
- public boolean isHidden() {
- if (path.length() == 0)
- return false;
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- return isHiddenImpl(properPath(true));
- }
-
- private native boolean isHiddenImpl(byte[] filePath);
-
- private native boolean isReadOnlyImpl(byte[] filePath);
-
- private native boolean isWriteOnlyImpl(byte[] filePath);
-
- private native byte[] getLinkImpl(byte[] filePath);
-
- /**
- * Answers the time this File was last modified.
- *
- * @return the time this File was last modified.
- *
- * @see #getPath
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public long lastModified() {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- long result = lastModifiedImpl(properPath(true));
- /* Temporary code to handle both return cases until natives fixed */
- if (result == -1 || result == 0)
- return 0;
- return (result * 1000);
- }
-
- private native long lastModifiedImpl(byte[] filePath);
-
- /**
- * Sets the time this File was last modified.
- *
- * @param time
- * The time to set the file as last modified.
- * @return the time this File was last modified.
- *
- * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
- */
- public boolean setLastModified(long time) {
- if (time >= 0) {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkWrite(path);
- return (setLastModifiedImpl(properPath(true), time));
- }
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg
- .getString("K006a")); //$NON-NLS-1$
- }
-
- private native boolean setLastModifiedImpl(byte[] path, long time);
-
- /**
- * Marks this file or directory to be read-only as defined by the operating
- * system.
- *
- * @return <code>true</code> if the operation was a success,
- * <code>false</code> otherwise
- */
- public boolean setReadOnly() {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkWrite(path);
- return (setReadOnlyImpl(properPath(true)));
- }
-
- private native boolean setReadOnlyImpl(byte[] path);
-
- /**
- * Answers the length of this File in bytes.
- *
- * @return the number of bytes in the file.
- *
- * @see #getPath
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public long length() {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- return lengthImpl(properPath(true));
- }
-
- private native long lengthImpl(byte[] filePath);
-
- /**
- * Answers an array of Strings representing the file names in the directory
- * represented by this File. If this File is not a directory the result is
- * <code>null</code>.
- * <p>
- * The entries <code>.</code> and <code>..</code> representing current
- * directory and parent directory are not returned as part of the list.
- *
- * @return an array of Strings or <code>null</code>.
- *
- * @see #getPath
- * @see #isDirectory
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public java.lang.String[] list() {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- if (!isDirectory())
- return null;
- byte[][] implList = listImpl(properPath(true));
- if (implList == null)
- return new String[0];
- String result[] = new String[implList.length];
- for (int index = 0; index < implList.length; index++)
- result[index] = org.apache.harmony.luni.util.Util.toString(implList[index]);
- return result;
- }
-
- /**
- * Answers an array of Files representing the file names in the directory
- * represented by this File. If this File is not a directory the result is
- * <code>null</code>. The Files returned will be absolute if this File is
- * absolute, relative otherwise.
- *
- * @return an array of Files or <code>null</code>.
- *
- * @see #getPath
- * @see #list()
- * @see #isDirectory
- */
- public File[] listFiles() {
- String[] tempNames = list();
- if (tempNames == null)
- return null;
- int resultLength = tempNames.length;
- File results[] = new File[resultLength];
- for (int i = 0; i < resultLength; i++)
- results[i] = new File(this, tempNames[i]);
- return results;
- }
-
- /**
- * Answers an array of Files representing the file names in the directory
- * represented by this File that match a specific filter. If this File is
- * not a directory the result is <code>null</code>. If the filter is
- * <code>null</code> then all filenames match.
- * <p>
- * The entries <code>.</code> and <code>..</code> representing current
- * directory and parent directory are not returned as part of the list.
- *
- * @param filter
- * the filter to match names to or <code>null</code>.
- * @return an array of Files or <code>null</code>.
- *
- * @see #list(FilenameFilter filter)
- * @see #getPath
- * @see #isDirectory
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public File[] listFiles(FilenameFilter filter) {
- String[] tempNames = list(filter);
- if (tempNames == null)
- return null;
- int resultLength = tempNames.length;
- File results[] = new File[resultLength];
- for (int i = 0; i < resultLength; i++)
- results[i] = new File(this, tempNames[i]);
- return results;
- }
-
- /**
- * Answers an array of Files representing the file names in the directory
- * represented by this File that match a specific filter. If this File is
- * not a directory the result is <code>null</code>. If the filter is
- * <code>null</code> then all filenames match.
- * <p>
- * The entries <code>.</code> and <code>..</code> representing current
- * directory and parent directory are not returned as part of the list.
- *
- * @param filter
- * the filter to match names to or <code>null</code>.
- * @return an array of Files or <code>null</code>.
- *
- * @see #getPath
- * @see #isDirectory
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public File[] listFiles(FileFilter filter) {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- if (!isDirectory())
- return null;
- byte[][] implList = listImpl(properPath(true));
- if (implList == null)
- return new File[0];
- java.util.Vector<File> tempResult = new java.util.Vector<File>();
- for (int index = 0; index < implList.length; index++) {
- String aName = org.apache.harmony.luni.util.Util.toString(implList[index]);
- File aFile = new File(this, aName);
- if (filter == null || filter.accept(aFile))
- tempResult.addElement(aFile);
- }
- File[] result = new File[tempResult.size()];
- tempResult.copyInto(result);
- return result;
- }
-
- /**
- * Answers an array of Strings representing the file names in the directory
- * represented by this File that match a specific filter. If this File is
- * not a directory the result is <code>null</code>. If the filter is
- * <code>null</code> then all filenames match.
- * <p>
- * The entries <code>.</code> and <code>..</code> representing current
- * directory and parent directory are not returned as part of the list.
- *
- * @param filter
- * the filter to match names to or <code>null</code>.
- * @return an array of Strings or <code>null</code>.
- *
- * @see #getPath
- * @see #isDirectory
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- */
- public java.lang.String[] list(FilenameFilter filter) {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkRead(path);
- if (!isDirectory())
- return null;
- byte[][] implList = listImpl(properPath(true));
- if (implList == null)
- return new String[0];
- java.util.Vector<String> tempResult = new java.util.Vector<String>();
- for (int index = 0; index < implList.length; index++) {
- String aName = org.apache.harmony.luni.util.Util.toString(implList[index]);
- if (filter == null || filter.accept(this, aName))
- tempResult.addElement(aName);
- }
- String[] result = new String[tempResult.size()];
- tempResult.copyInto(result);
- return result;
- }
-
- private synchronized static native byte[][] listImpl(byte[] path);
-
- /**
- * Creates the directory named by the trailing filename of this File. Not
- * all directories required to create this File are created.
- *
- * @return <code>true</code> if the directory was created,
- * <code>false</code> otherwise.
- *
- * @see #getPath
- * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
- */
- public boolean mkdir() {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkWrite(path);
- return mkdirImpl(properPath(true));
- }
-
- private native boolean mkdirImpl(byte[] filePath);
-
- /**
- * Create all the directories needed for this File. If the terminal
- * directory already exists, answer false. If the directories were created
- * successfully, answer <code>true</code>.
- *
- * @return <code>true</code> if the necessary directories were created,
- * <code>false</code> otherwise.
- *
- */
- public boolean mkdirs() {
- /* If the terminal directory already exists, answer false */
- if (exists())
- return false;
-
- /* If the receiver can be created, answer true */
- if (mkdir())
- return true;
-
- String parentDir = getParent();
- /* If there is no parent and we were not created, answer false */
- if (parentDir == null)
- return false;
-
- /* Otherwise, try to create a parent directory and then this directory */
- return (new File(parentDir).mkdirs() && mkdir());
- }
-
- /**
- * Creates the file specified by this File. If the file already exists this
- * method returns <code>false</code>. Otherwise, if the file is created
- * successfully, the result is <code>true</code>. An IOException will be
- * thrown if the directory to contain this file does not exist.
- *
- * @return <code>true</code> if this File was created, <code>false</code>
- * otherwise.
- *
- * @throws IOException
- * if an I/O error occurs or the directory does not exist.
- *
- * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
- */
- public boolean createNewFile() throws IOException {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkWrite(path);
- if(0 == path.length()) {
- throw new IOException(org.apache.harmony.luni.util.Msg.getString("KA012")); //$NON-NLS-1$
- }
- int result = newFileImpl(properPath(true));
- switch (result) {
- case 0:
- return true;
- case 1:
- case 3:
- return false;
- default:
- throw new IOException(org.apache.harmony.luni.util.Msg.getString("K01c2", path)); //$NON-NLS-1$
- }
- }
-
- private native int newFileImpl(byte[] filePath);
-
- /**
- * Creates an empty temporary file using the given prefix and suffix as part
- * of the file name. If suffix is null, <code>.tmp</code> is used.
- *
- * @param prefix
- * the prefix to the temp file name
- * @param suffix
- * the suffix to the temp file name
- * @return the temporary file
- *
- * @throws IOException
- * If an error occurs when writing the file
- */
- public static File createTempFile(String prefix, String suffix)
- throws IOException {
- return createTempFile(prefix, suffix, null);
- }
-
- /**
- * Creates an empty temporary file in the given directory using the given
- * prefix and suffix as part of the file name.
- *
- * @param prefix
- * the prefix to the temp file name
- * @param suffix
- * the suffix to the temp file name
- * @param directory
- * the location to which the temp file is to be written, or null
- * for the default temp location
- * @return the temporary file
- *
- * @throws IOException
- * If an error occurs when writing the file
- */
- public static File createTempFile(String prefix, String suffix,
- File directory) throws IOException {
- if (prefix != null) {
- if (prefix.length() >= 3) {
- String newSuffix = suffix == null ? ".tmp" : suffix; //$NON-NLS-1$
- String tmpDir = "."; //$NON-NLS-1$
- tmpDir = AccessController.doPrivileged(new PriviAction<String>("java.io.tmpdir", ".")); //$NON-NLS-1$//$NON-NLS-2$
- File result, tmpDirFile = directory == null ? new File(tmpDir)
- : directory;
- do {
- result = genTempFile(prefix, newSuffix, tmpDirFile);
- } while (!result.createNewFile());
- return result;
- }
- throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg
- .getString("K006b")); //$NON-NLS-1$
- }
- throw new NullPointerException();
- }
-
- private static File genTempFile(String prefix, String suffix, File directory) {
- if (counter == 0) {
- int newInt = new java.util.Random().nextInt();
- counter = ((newInt / 65535) & 0xFFFF) + 0x2710;
- }
- StringBuilder newName = new StringBuilder();
- newName.append(prefix);
- newName.append(counter++);
- newName.append(suffix);
- return new File(directory, newName.toString());
- }
-
- /**
- * Answer a String representing the proper path for the receiver. If the
- * receiver is absolute do not prepend the user.dir property, otherwise do.
- *
- * @param internal
- * is user.dir internal
- * @return the proper path
- */
- byte[] properPath(boolean internal) {
- if (properPath != null)
- return properPath;
- byte[] pathBytes = org.apache.harmony.luni.util.Util.getBytes(path);
- if (isAbsoluteImpl(pathBytes))
- return properPath = pathBytes;
- // Check security by getting user.dir when the path is not absolute
- String userdir;
- if (internal) {
- userdir = AccessController.doPrivileged(new PriviAction<String>("user.dir")); //$NON-NLS-1$
- } else
- userdir = System.getProperty("user.dir"); //$NON-NLS-1$
- if ((properPath = properPathImpl(pathBytes)) != null)
- return properPath;
- if (path.length() == 0)
- return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir);
- int length = userdir.length();
- if (path.charAt(0) == '\\') {
- if (length > 1 && userdir.charAt(1) == ':') {
- return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir
- .substring(0, 2)
- + path);
- }
- if (length > 0 && userdir.charAt(length - 1) == separatorChar) {
- return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir
- + path.substring(1));
- }
- return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir + path);
- }
- if (length > 0 && userdir.charAt(length - 1) == separatorChar) {
- return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir + path);
- }
- return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir + separator
- + path);
- }
-
- private static native byte[] properPathImpl(byte[] path);
-
- /**
- * Renames this File to the name represented by the File <code>dest</code>.
- * This works for both normal files and directories.
- *
- * @param dest
- * the File containing the new name.
- * @return <code>true</code> if the File was renamed, <code>false</code>
- * otherwise.
- *
- * @see #getPath
- * @see java.lang.SecurityManager#checkRead(FileDescriptor)
- * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
- */
- public boolean renameTo(java.io.File dest) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkWrite(path);
- security.checkWrite(dest.path);
- }
- return renameToImpl(properPath(true), dest.properPath(true));
- }
-
- private native boolean renameToImpl(byte[] pathExist, byte[] pathNew);
-
- /**
- * Answers a string containing a concise, human-readable description of the
- * receiver.
- *
- * @return a printable representation for the receiver.
- */
- public String toString() {
- return path.toString();
- }
-
- /**
- * Answers a <code>file</code> URI for this File. The URI is System
- * dependent and may not be transferable between different operating/file
- * systems.
- *
- * @return a <code>file</code> URI for this File.
- */
- public URI toURI() {
- String name = getAbsoluteName();
- try {
- if (!name.startsWith("/")) // On Windows, absolute paths might not //$NON-NLS-1$
- // start with sep.
- return new URI("file", null, //$NON-NLS-1$
- new StringBuilder(name.length() + 1).append('/').append(
- name).toString(), null, null);
- else if (name.startsWith("//")) //$NON-NLS-1$
- return new URI("file", name, null); // UNC path //$NON-NLS-1$
- return new URI("file", null, name, null, null); //$NON-NLS-1$
- } catch (URISyntaxException e) {
- // this should never happen
- return null;
- }
- }
-
- /**
- * Answers a <code>file</code> URL for this File. The URL is System
- * dependent and may not be transferable between different operating/file
- * systems.
- *
- * @return a <code>file</code> URL for this File.
- *
- * @throws java.net.MalformedURLException
- * if the path cannot be transformed into an URL
- */
- public URL toURL() throws java.net.MalformedURLException {
- String name = getAbsoluteName();
- if (!name.startsWith("/")) // On Windows, absolute paths might not //$NON-NLS-1$
- // start with sep.
- return new URL("file", "", -1, new StringBuilder(name.length() + 1) //$NON-NLS-1$ //$NON-NLS-2$
- .append('/').append(name).toString(), null);
- else if (name.startsWith("//")) //$NON-NLS-1$
- return new URL("file:" + name); // UNC path //$NON-NLS-1$
- return new URL("file", "", -1, name, null); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- private String getAbsoluteName() {
- String name = getAbsolutePath();
- if (isDirectory() && name.charAt(name.length() - 1) != separatorChar) {
- // Directories must end with a slash
- name = new StringBuilder(name.length() + 1).append(name)
- .append('/').toString();
- }
- if (separatorChar != '/') { // Must convert slashes.
- name = name.replace(separatorChar, '/');
- }
- return name;
- }
-
- private void writeObject(ObjectOutputStream stream) throws IOException {
- stream.defaultWriteObject();
- stream.writeChar(separatorChar);
-
- }
-
- private void readObject(ObjectInputStream stream) throws IOException,
- ClassNotFoundException {
- stream.defaultReadObject();
- char inSeparator = stream.readChar();
- path = path.replace(inSeparator, separatorChar);
- }
-
-}
+/* Copyright 1998, 2006 The Apache Software Foundation or its licensors, as applicable
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.AccessController;
+
+import org.apache.harmony.luni.util.PriviAction;
+
+/**
+ * File is a class which represents a file name or directory. The file may be
+ * absolute relative to the root directory of the file system or relative to the
+ * current directory in which the program is running.
+ * <p>
+ * This class provides methods for querying/changing information about the file
+ * and also directory listing capabilities if the File represents a directory.
+ * <p>
+ * When manipulating file paths, the static fields of this class may be used to
+ * determine the platform specific separators.
+ *
+ * @see java.io.Serializable
+ * @see java.lang.Comparable
+ */
+
+public class File implements Serializable, Comparable<File> {
+ private static final long serialVersionUID = 301077366599181567L;
+
+ private String path;
+
+ byte[] properPath;
+
+ /**
+ * System dependent file separator character.
+ */
+ public static final char separatorChar;
+
+ /**
+ * System dependent file separator String. The initial value of this field
+ * is the System property "file.separator".
+ */
+ public static final String separator;
+
+ /**
+ * System dependent path separator character.
+ */
+ public static final char pathSeparatorChar;
+
+ /**
+ * System dependent path separator String. The initial value of this field
+ * is the System property "path.separator".
+ */
+ public static final String pathSeparator;
+
+ /* Temp file counter needs java.util.Random from mJava */
+ private static int counter;
+
+ private static boolean caseSensitive;
+
+ private static native void oneTimeInitialization();
+
+ static {
+ oneTimeInitialization();
+
+ // The default protection domain grants access to these properties
+ separatorChar = System.getProperty("file.separator", "\\").charAt(0); //$NON-NLS-1$ //$NON-NLS-2$
+ pathSeparatorChar = System.getProperty("path.separator", ";").charAt(0); //$NON-NLS-1$//$NON-NLS-2$
+ separator = new String(new char[] { separatorChar }, 0, 1);
+ pathSeparator = new String(new char[] { pathSeparatorChar }, 0, 1);
+ caseSensitive = isCaseSensitiveImpl();
+ }
+
+ /**
+ * Constructs a new File using the specified directory and name.
+ *
+ * @param dir
+ * the directory for the file name
+ * @param name
+ * the file name to be contained in the dir
+ */
+
+ public File(File dir, String name) {
+ if (name != null) {
+ if (dir == null) {
+ this.path = fixSlashes(name);
+ } else {
+ this.path = calculatePath(dir.getPath(),name);
+ }
+ } else
+ throw new NullPointerException();
+ }
+
+ /**
+ * Constructs a new File using the specified path.
+ *
+ * @param path
+ * the path to be used for the file
+ */
+ public File(String path) {
+ // NullPointerException thrown by fixSlashes
+ this.path = fixSlashes(path);
+ }
+
+ /**
+ * Constructs a new File using the specified directory and name placing a
+ * path separator between the two.
+ *
+ * @param dirPath
+ * the directory for the file name
+ * @param name
+ * the file name to be contained in the dir
+ */
+ public File(String dirPath, String name) {
+ if (name != null) {
+ if (dirPath == null) {
+ this.path = fixSlashes(name);
+ } else {
+ this.path = calculatePath(dirPath, name);
+ }
+ } else
+ throw new NullPointerException();
+ }
+
+ /**
+ * Constructs a new File using the path of the specified URI
+ *
+ * <code>uri</code> needs to be an absolute and hierarchical
+ * <code>URI </code> with file scheme, and non-empty path component, but
+ * with undefined authority, query or fragment components.
+ *
+ * @param uri
+ * the URI instance which will be used to construct this file
+ *
+ * @throws IllegalArgumentException
+ * if <code>uri</code> does not comply with the conditions
+ * above.
+ *
+ * @see #toURI
+ * @see java.net.URI
+ */
+ public File(URI uri) {
+ // check pre-conditions
+ checkURI(uri);
+ this.path = fixSlashes(uri.getPath());
+ }
+
+ private String calculatePath(String dirPath, String name) {
+ // Remove all the proceeding separator chars from name
+ name = fixSlashes(name);
+ while (name.length() > 0 && (name.charAt(0) == separatorChar))
+ name = name.substring(1, name.length());
+
+ // Ensure there is a separator char between dirPath and name
+ dirPath = fixSlashes(dirPath);
+ if (dirPath.length() > 0 && (dirPath.charAt(dirPath.length() - 1) == separatorChar)) {
+ return dirPath + name;
+ }
+
+ return dirPath + separatorChar + name;
+ }
+
+ private void checkURI(URI uri) {
+ if (!uri.isAbsolute()) {
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
+ "K031a", uri)); //$NON-NLS-1$
+ } else if (!uri.getRawSchemeSpecificPart().startsWith("/")) { //$NON-NLS-1$
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
+ "K031b", uri)); //$NON-NLS-1$
+ }
+
+ String temp = uri.getScheme();
+ if (temp == null || !temp.equals("file")) { //$NON-NLS-1$
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
+ "K031c", uri)); //$NON-NLS-1$
+ }
+
+ temp = uri.getRawPath();
+ if (temp == null || temp.length() == 0) {
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
+ "K031d", uri)); //$NON-NLS-1$
+ }
+
+ if (uri.getRawAuthority() != null) {
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
+ "K031e", new String[] { "authority", uri.toString() })); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ if (uri.getRawQuery() != null)
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
+ "K031e", new String[] { "query", uri.toString() })); //$NON-NLS-1$//$NON-NLS-2$
+
+ if (uri.getRawFragment() != null)
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg.getString(
+ "K031e", new String[] { "fragment", uri.toString() })); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private static native byte[][] rootsImpl();
+
+ private static native boolean isCaseSensitiveImpl();
+
+ /**
+ * Lists the filesystem roots.
+ *
+ * The Java platform may support zero or more filesystems, each with its own
+ * platform-dependent root. Further, the canonical pathname of any file on
+ * the system will always begin with one of the returned filesystem roots.
+ *
+ * @return the array of filesystem roots
+ */
+ public static File[] listRoots() {
+ byte[][] rootsList = rootsImpl();
+ if (rootsList == null)
+ return new File[0];
+ File result[] = new File[rootsList.length];
+ for (int i = 0; i < rootsList.length; i++)
+ result[i] = new File(org.apache.harmony.luni.util.Util.toString(rootsList[i]));
+ return result;
+ }
+
+ /**
+ * The purpose of this method is to take a path and fix the slashes up. This
+ * includes changing them all to the current platforms fileSeparator and
+ * removing duplicates.
+ */
+ private String fixSlashes(String origPath) {
+ int uncIndex = 1;
+ int length = origPath.length(), newLength = 0;
+ if (separatorChar == '/') // disable UNC names
+ uncIndex = 0;
+ else if (length > 2 && origPath.charAt(1) == ':')
+ uncIndex = 2;
+
+ boolean foundSlash = false;
+ char newPath[] = origPath.toCharArray();
+ for (int i = 0; i < length; i++) {
+ char pathChar = newPath[i];
+ if (pathChar == '\\' || pathChar == '/') {
+ /* UNC Name requires 2 leading slashes */
+ if ((foundSlash && i == uncIndex) || !foundSlash) {
+ newPath[newLength++] = separatorChar;
+ foundSlash = true;
+ }
+ } else {
+ // check for leading slashes before a drive
+ if (pathChar == ':'
+ && uncIndex > 0
+ && (newLength == 2 || (newLength == 3 && newPath[1] == separatorChar))
+ && newPath[0] == separatorChar) {
+ newPath[0] = newPath[newLength - 1];
+ newLength = 1;
+ // allow trailing slash after drive letter
+ uncIndex = 2;
+ }
+ newPath[newLength++] = pathChar;
+ foundSlash = false;
+ }
+ }
+ // remove trailing slash
+ if (foundSlash
+ && (newLength > (uncIndex + 1) || (newLength == 2 && newPath[0] != separatorChar))) {
+ newLength--;
+ }
+ String tempPath = new String(newPath, 0, newLength);
+ // If it's the same keep it identical for SecurityManager purposes
+ if (!tempPath.equals(origPath)) {
+ return tempPath;
+ }
+ return origPath;
+ }
+
+ /**
+ * Answers a boolean indicating whether or not the current context is allowed
+ * to read this File.
+ *
+ * @return <code>true</code> if this File can be read, <code>false</code>
+ * otherwise.
+ *
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public boolean canRead() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ return exists() && !isWriteOnlyImpl(properPath(true));
+ }
+
+ /**
+ * Answers a boolean indicating whether or not the current context is
+ * allowed to write to this File.
+ *
+ * @return <code>true</code> if this File can be written,
+ * <code>false</code> otherwise.
+ *
+ * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
+ */
+ public boolean canWrite() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkWrite(path);
+
+ // Cannot use exists() since that does an unwanted read-check.
+ boolean exists = false;
+ if (path.length() > 0) {
+ exists = existsImpl(properPath(true));
+ }
+ return exists && !isReadOnlyImpl(properPath(true));
+ }
+
+ /**
+ * Answers the relative sort ordering of paths for the receiver and given
+ * argument. The ordering is platform dependent.
+ *
+ * @param another
+ * a File to compare the receiver to
+ * @return an int determined by comparing the two paths. The meaning is
+ * described in the Comparable interface.
+ * @see Comparable
+ */
+ public int compareTo(File another) {
+ if (caseSensitive) {
+ return this.getPath().compareTo(another.getPath());
+ }
+ return this.getPath().compareToIgnoreCase(another.getPath());
+ }
+
+ /**
+ * Deletes the file specified by this File. Directories must be empty before
+ * they will be deleted.
+ *
+ * @return <code>true</code> if this File was deleted, <code>false</code>
+ * otherwise.
+ *
+ * @see java.lang.SecurityManager#checkDelete
+ */
+ public boolean delete() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkDelete(path);
+ }
+ byte[] propPath = properPath(true);
+ if ((path.length() != 0) && isDirectoryImpl(propPath)) {
+ return deleteDirImpl(propPath);
+ }
+ return deleteFileImpl(propPath);
+ }
+
+ private native boolean deleteDirImpl(byte[] filePath);
+
+ private native boolean deleteFileImpl(byte[] filePath);
+
+ /**
+ * When the virtual machine terminates, any abstract files which have been
+ * sent <code>deleteOnExit()</code> will be deleted. This will only happen
+ * when the virtual machine terminates normally as described by the Java
+ * Language Specification section 12.9.
+ *
+ */
+ public void deleteOnExit() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkDelete(path);
+
+ org.apache.harmony.luni.util.DeleteOnExit.addFile(org.apache.harmony.luni.util.Util
+ .toString(properPath(true)));
+ }
+
+ /**
+ * Compares the argument <code>obj</code> to the receiver, and answers
+ * <code>true</code> if they represent the <em>same</em> object using a
+ * path specific comparison.
+ *
+ * @param obj
+ * the Object to compare with this Object
+ * @return <code>true</code> if the object is the same as this object,
+ * <code>false</code> otherwise.
+ */
+ public boolean equals(Object obj) {
+ if (!(obj instanceof File))
+ return false;
+ if (!caseSensitive) {
+ return path.equalsIgnoreCase(((File) obj).getPath());
+ }
+ return path.equals(((File) obj).getPath());
+ }
+
+ /**
+ * Answers a boolean indicating whether or not this File can be found on the
+ * underlying file system.
+ *
+ * @return <code>true</code> if this File exists, <code>false</code>
+ * otherwise.
+ *
+ * @see #getPath
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public boolean exists() {
+ if (path.length() == 0)
+ return false;
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ return existsImpl(properPath(true));
+ }
+
+ private native boolean existsImpl(byte[] filePath);
+
+ /**
+ * Answers the absolute file path of this File.
+ *
+ * @return the absolute file path
+ *
+ * @see java.lang.SecurityManager#checkPropertyAccess
+ */
+ public String getAbsolutePath() {
+ byte[] absolute = properPath(false);
+ return org.apache.harmony.luni.util.Util.toString(absolute);
+ }
+
+ /**
+ * Answers a new File constructed using the absolute file path of this File.
+ *
+ * @return a new File from this absolute file path
+ *
+ * @see java.lang.SecurityManager#checkPropertyAccess
+ */
+ public File getAbsoluteFile() {
+ return new File(this.getAbsolutePath());
+ }
+
+ /**
+ * Answers the absolute file path of this File with all references resolved.
+ * An <em>absolute</em> file path is one which begins at the root of the
+ * file system. The canonical path is one in which all references have been
+ * resolved. For the cases of '..' and '.' where the file system supports
+ * parent and working directory respectively, these should be removed and
+ * replaced with a direct directory reference. If the File does not exist,
+ * getCanonicalPath() may not resolve any references and simply return an
+ * absolute path name or throw an IOException.
+ *
+ * @return the canonical file path
+ *
+ * @throws IOException
+ * if an IO error occurs
+ *
+ * @see java.lang.SecurityManager#checkPropertyAccess
+ */
+ public String getCanonicalPath() throws IOException {
+ byte[] result = properPath(false);
+
+ boolean exists = false;
+ byte[] pathBytes = result;
+ do {
+ byte[] linkBytes = getLinkImpl(pathBytes);
+ if (linkBytes == pathBytes)
+ break;
+ if (linkBytes[0] == separatorChar) {
+ pathBytes = linkBytes;
+ } else {
+ int index = pathBytes.length - 1;
+ while (pathBytes[index] != separatorChar)
+ index--;
+ byte[] temp = new byte[index + 1 + linkBytes.length];
+ System.arraycopy(pathBytes, 0, temp, 0, index + 1);
+ System.arraycopy(linkBytes, 0, temp, index + 1,
+ linkBytes.length);
+ pathBytes = temp;
+ }
+ exists = existsImpl(pathBytes);
+ } while (exists);
+ if (exists)
+ result = pathBytes;
+
+ int numSeparators = 1;
+ for (int i = 0; i < result.length; i++)
+ if (result[i] == separatorChar)
+ numSeparators++;
+ int sepLocations[] = new int[numSeparators];
+ int rootLoc = 0;
+ if (separatorChar != '/')
+ if (result[0] == '\\')
+ rootLoc = (result.length > 1 && result[1] == '\\') ? 1 : 0;
+ else
+ rootLoc = 2; // skip drive i.e. c:
+ byte newResult[] = new byte[result.length + 1];
+ int newLength = 0, lastSlash = 0, foundDots = 0;
+ sepLocations[lastSlash] = rootLoc;
+ for (int i = 0; i <= result.length; i++) {
+ if (i < rootLoc)
+ newResult[newLength++] = result[i];
+ else {
+ if (i == result.length || result[i] == separatorChar) {
+ if (i == result.length && foundDots == 0)
+ break;
+ if (foundDots == 1) {
+ /* Don't write anything, just reset and continue */
+ foundDots = 0;
+ continue;
+ }
+ if (foundDots > 1) {
+ /* Go back N levels */
+ lastSlash = lastSlash > (foundDots - 1) ? lastSlash
+ - (foundDots - 1) : 0;
+ newLength = sepLocations[lastSlash] + 1;
+ foundDots = 0;
+ continue;
+ }
+ sepLocations[++lastSlash] = newLength;
+ newResult[newLength++] = (byte) separatorChar;
+ continue;
+ }
+ if (result[i] == '.') {
+ foundDots++;
+ continue;
+ }
+ /* Found some dots within text, write them out */
+ if (foundDots > 0)
+ for (int j = 0; j < foundDots; j++)
+ newResult[newLength++] = (byte) '.';
+ newResult[newLength++] = result[i];
+ foundDots = 0;
+ }
+ }
+ // remove trailing slash
+ if (newLength > (rootLoc + 1)
+ && newResult[newLength - 1] == separatorChar)
+ newLength--;
+ newResult[newLength] = 0;
+ newResult = getCanonImpl(newResult);
+ newLength = newResult.length;
+ return org.apache.harmony.luni.util.Util.toString(newResult, 0, newLength);
+ }
+
+ /**
+ * Answers a new File created using the canonical file path of this File.
+ * Equivalent to <code>new File(this.getCanonicalPath())</code>.
+ *
+ * @return the canonical file path
+ *
+ * @throws IOException
+ * If an IO error occurs
+ *
+ * @see java.lang.SecurityManager#checkPropertyAccess
+ */
+ public File getCanonicalFile() throws IOException {
+ return new File(getCanonicalPath());
+ }
+
+ private native byte[] getCanonImpl(byte[] filePath);
+
+ /**
+ * Answers the filename (not directory) of this File.
+ *
+ * @return the filename or empty string
+ */
+ public String getName() {
+ int separatorIndex = path.lastIndexOf(separator);
+ return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1,
+ path.length());
+ }
+
+ /**
+ * Answers the pathname of the parent of this File. This is the path up to
+ * but not including the last name. <code>null</code> is returned when
+ * there is no parent.
+ *
+ * @return the parent name or <code>null</code>
+ */
+ public String getParent() {
+ int length = path.length(), firstInPath = 0;
+ if (separatorChar == '\\' && length > 2 && path.charAt(1) == ':')
+ firstInPath = 2;
+ int index = path.lastIndexOf(separatorChar);
+ if (index == -1 && firstInPath > 0)
+ index = 2;
+ if (index == -1 || path.charAt(length - 1) == separatorChar)
+ return null;
+ if (path.indexOf(separatorChar) == index
+ && path.charAt(firstInPath) == separatorChar)
+ return path.substring(0, index + 1);
+ return path.substring(0, index);
+ }
+
+ /**
+ * Answers a new File made from the pathname of the parent of this File.
+ * This is the path up to but not including the last name. <code>null</code>
+ * is returned when there is no parent.
+ *
+ * @return a new File representing parent or <code>null</code>
+ */
+ public File getParentFile() {
+ String tempParent = getParent();
+ if (tempParent == null)
+ return null;
+ return new File(tempParent);
+ }
+
+ /**
+ * Answers the file path of this File.
+ *
+ * @return the file path
+ */
+ public String getPath() {
+ return path;
+ }
+
+ /**
+ * Answers an integer hash code for the receiver. Any two objects which
+ * answer <code>true</code> when passed to <code>equals</code> must
+ * answer the same value for this method.
+ *
+ * @return the receiver's hash
+ *
+ * @see #equals
+ */
+ public int hashCode() {
+ if (caseSensitive)
+ return path.hashCode() ^ 1234321;
+ else
+ return path.toLowerCase().hashCode() ^ 1234321;
+ }
+
+ /**
+ * Answers if this File is an absolute pathname. Whether a pathname is
+ * absolute is platform specific. On UNIX it is if the path starts with the
+ * character '/', on Windows it is absolute if either it starts with '\',
+ * '/', '\\' (to represent a file server), or a letter followed by a colon.
+ *
+ * @return <code>true</code> if this File is absolute, <code>false</code>
+ * otherwise.
+ *
+ * @see #getPath
+ */
+ public boolean isAbsolute() {
+ return isAbsoluteImpl(org.apache.harmony.luni.util.Util.getBytes(path));
+ }
+
+ private native boolean isAbsoluteImpl(byte[] filePath);
+
+ /**
+ * Answers if this File represents a <em>directory</em> on the underlying
+ * file system.
+ *
+ * @return <code>true</code> if this File is a directory,
+ * <code>false</code> otherwise.
+ *
+ * @see #getPath
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public boolean isDirectory() {
+ if (path.length() == 0)
+ return false;
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ return isDirectoryImpl(properPath(true));
+ }
+
+ private native boolean isDirectoryImpl(byte[] filePath);
+
+ /**
+ * Answers if this File represents a <em>file</em> on the underlying file
+ * system.
+ *
+ * @return <code>true</code> if this File is a file, <code>false</code>
+ * otherwise.
+ *
+ * @see #getPath
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public boolean isFile() {
+ if (path.length() == 0)
+ return false;
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ return isFileImpl(properPath(true));
+ }
+
+ private native boolean isFileImpl(byte[] filePath);
+
+ /**
+ * Returns whether or not this file is a hidden file as defined by the
+ * operating system.
+ *
+ * @return <code>true</code> if the file is hidden, <code>false</code>
+ * otherwise.
+ */
+ public boolean isHidden() {
+ if (path.length() == 0)
+ return false;
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ return isHiddenImpl(properPath(true));
+ }
+
+ private native boolean isHiddenImpl(byte[] filePath);
+
+ private native boolean isReadOnlyImpl(byte[] filePath);
+
+ private native boolean isWriteOnlyImpl(byte[] filePath);
+
+ private native byte[] getLinkImpl(byte[] filePath);
+
+ /**
+ * Answers the time this File was last modified.
+ *
+ * @return the time this File was last modified.
+ *
+ * @see #getPath
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public long lastModified() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ long result = lastModifiedImpl(properPath(true));
+ /* Temporary code to handle both return cases until natives fixed */
+ if (result == -1 || result == 0)
+ return 0;
+ return (result * 1000);
+ }
+
+ private native long lastModifiedImpl(byte[] filePath);
+
+ /**
+ * Sets the time this File was last modified.
+ *
+ * @param time
+ * The time to set the file as last modified.
+ * @return the time this File was last modified.
+ *
+ * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
+ */
+ public boolean setLastModified(long time) {
+ if (time >= 0) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkWrite(path);
+ return (setLastModifiedImpl(properPath(true), time));
+ }
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg
+ .getString("K006a")); //$NON-NLS-1$
+ }
+
+ private native boolean setLastModifiedImpl(byte[] path, long time);
+
+ /**
+ * Marks this file or directory to be read-only as defined by the operating
+ * system.
+ *
+ * @return <code>true</code> if the operation was a success,
+ * <code>false</code> otherwise
+ */
+ public boolean setReadOnly() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkWrite(path);
+ return (setReadOnlyImpl(properPath(true)));
+ }
+
+ private native boolean setReadOnlyImpl(byte[] path);
+
+ /**
+ * Answers the length of this File in bytes.
+ *
+ * @return the number of bytes in the file.
+ *
+ * @see #getPath
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public long length() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ return lengthImpl(properPath(true));
+ }
+
+ private native long lengthImpl(byte[] filePath);
+
+ /**
+ * Answers an array of Strings representing the file names in the directory
+ * represented by this File. If this File is not a directory the result is
+ * <code>null</code>.
+ * <p>
+ * The entries <code>.</code> and <code>..</code> representing current
+ * directory and parent directory are not returned as part of the list.
+ *
+ * @return an array of Strings or <code>null</code>.
+ *
+ * @see #getPath
+ * @see #isDirectory
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public java.lang.String[] list() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ if (!isDirectory())
+ return null;
+ byte[][] implList = listImpl(properPath(true));
+ if (implList == null)
+ return new String[0];
+ String result[] = new String[implList.length];
+ for (int index = 0; index < implList.length; index++)
+ result[index] = org.apache.harmony.luni.util.Util.toString(implList[index]);
+ return result;
+ }
+
+ /**
+ * Answers an array of Files representing the file names in the directory
+ * represented by this File. If this File is not a directory the result is
+ * <code>null</code>. The Files returned will be absolute if this File is
+ * absolute, relative otherwise.
+ *
+ * @return an array of Files or <code>null</code>.
+ *
+ * @see #getPath
+ * @see #list()
+ * @see #isDirectory
+ */
+ public File[] listFiles() {
+ String[] tempNames = list();
+ if (tempNames == null)
+ return null;
+ int resultLength = tempNames.length;
+ File results[] = new File[resultLength];
+ for (int i = 0; i < resultLength; i++)
+ results[i] = new File(this, tempNames[i]);
+ return results;
+ }
+
+ /**
+ * Answers an array of Files representing the file names in the directory
+ * represented by this File that match a specific filter. If this File is
+ * not a directory the result is <code>null</code>. If the filter is
+ * <code>null</code> then all filenames match.
+ * <p>
+ * The entries <code>.</code> and <code>..</code> representing current
+ * directory and parent directory are not returned as part of the list.
+ *
+ * @param filter
+ * the filter to match names to or <code>null</code>.
+ * @return an array of Files or <code>null</code>.
+ *
+ * @see #list(FilenameFilter filter)
+ * @see #getPath
+ * @see #isDirectory
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public File[] listFiles(FilenameFilter filter) {
+ String[] tempNames = list(filter);
+ if (tempNames == null)
+ return null;
+ int resultLength = tempNames.length;
+ File results[] = new File[resultLength];
+ for (int i = 0; i < resultLength; i++)
+ results[i] = new File(this, tempNames[i]);
+ return results;
+ }
+
+ /**
+ * Answers an array of Files representing the file names in the directory
+ * represented by this File that match a specific filter. If this File is
+ * not a directory the result is <code>null</code>. If the filter is
+ * <code>null</code> then all filenames match.
+ * <p>
+ * The entries <code>.</code> and <code>..</code> representing current
+ * directory and parent directory are not returned as part of the list.
+ *
+ * @param filter
+ * the filter to match names to or <code>null</code>.
+ * @return an array of Files or <code>null</code>.
+ *
+ * @see #getPath
+ * @see #isDirectory
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public File[] listFiles(FileFilter filter) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ if (!isDirectory())
+ return null;
+ byte[][] implList = listImpl(properPath(true));
+ if (implList == null)
+ return new File[0];
+ java.util.Vector<File> tempResult = new java.util.Vector<File>();
+ for (int index = 0; index < implList.length; index++) {
+ String aName = org.apache.harmony.luni.util.Util.toString(implList[index]);
+ File aFile = new File(this, aName);
+ if (filter == null || filter.accept(aFile))
+ tempResult.addElement(aFile);
+ }
+ File[] result = new File[tempResult.size()];
+ tempResult.copyInto(result);
+ return result;
+ }
+
+ /**
+ * Answers an array of Strings representing the file names in the directory
+ * represented by this File that match a specific filter. If this File is
+ * not a directory the result is <code>null</code>. If the filter is
+ * <code>null</code> then all filenames match.
+ * <p>
+ * The entries <code>.</code> and <code>..</code> representing current
+ * directory and parent directory are not returned as part of the list.
+ *
+ * @param filter
+ * the filter to match names to or <code>null</code>.
+ * @return an array of Strings or <code>null</code>.
+ *
+ * @see #getPath
+ * @see #isDirectory
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ */
+ public java.lang.String[] list(FilenameFilter filter) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkRead(path);
+ if (!isDirectory())
+ return null;
+ byte[][] implList = listImpl(properPath(true));
+ if (implList == null)
+ return new String[0];
+ java.util.Vector<String> tempResult = new java.util.Vector<String>();
+ for (int index = 0; index < implList.length; index++) {
+ String aName = org.apache.harmony.luni.util.Util.toString(implList[index]);
+ if (filter == null || filter.accept(this, aName))
+ tempResult.addElement(aName);
+ }
+ String[] result = new String[tempResult.size()];
+ tempResult.copyInto(result);
+ return result;
+ }
+
+ private synchronized static native byte[][] listImpl(byte[] path);
+
+ /**
+ * Creates the directory named by the trailing filename of this File. Not
+ * all directories required to create this File are created.
+ *
+ * @return <code>true</code> if the directory was created,
+ * <code>false</code> otherwise.
+ *
+ * @see #getPath
+ * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
+ */
+ public boolean mkdir() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkWrite(path);
+ return mkdirImpl(properPath(true));
+ }
+
+ private native boolean mkdirImpl(byte[] filePath);
+
+ /**
+ * Create all the directories needed for this File. If the terminal
+ * directory already exists, answer false. If the directories were created
+ * successfully, answer <code>true</code>.
+ *
+ * @return <code>true</code> if the necessary directories were created,
+ * <code>false</code> otherwise.
+ *
+ */
+ public boolean mkdirs() {
+ /* If the terminal directory already exists, answer false */
+ if (exists())
+ return false;
+
+ /* If the receiver can be created, answer true */
+ if (mkdir())
+ return true;
+
+ String parentDir = getParent();
+ /* If there is no parent and we were not created, answer false */
+ if (parentDir == null)
+ return false;
+
+ /* Otherwise, try to create a parent directory and then this directory */
+ return (new File(parentDir).mkdirs() && mkdir());
+ }
+
+ /**
+ * Creates the file specified by this File. If the file already exists this
+ * method returns <code>false</code>. Otherwise, if the file is created
+ * successfully, the result is <code>true</code>. An IOException will be
+ * thrown if the directory to contain this file does not exist.
+ *
+ * @return <code>true</code> if this File was created, <code>false</code>
+ * otherwise.
+ *
+ * @throws IOException
+ * if an I/O error occurs or the directory does not exist.
+ *
+ * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
+ */
+ public boolean createNewFile() throws IOException {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ security.checkWrite(path);
+ if(0 == path.length()) {
+ throw new IOException(org.apache.harmony.luni.util.Msg.getString("KA012")); //$NON-NLS-1$
+ }
+ int result = newFileImpl(properPath(true));
+ switch (result) {
+ case 0:
+ return true;
+ case 1:
+ case 3:
+ return false;
+ default:
+ throw new IOException(org.apache.harmony.luni.util.Msg.getString("K01c2", path)); //$NON-NLS-1$
+ }
+ }
+
+ private native int newFileImpl(byte[] filePath);
+
+ /**
+ * Creates an empty temporary file using the given prefix and suffix as part
+ * of the file name. If suffix is null, <code>.tmp</code> is used.
+ *
+ * @param prefix
+ * the prefix to the temp file name
+ * @param suffix
+ * the suffix to the temp file name
+ * @return the temporary file
+ *
+ * @throws IOException
+ * If an error occurs when writing the file
+ */
+ public static File createTempFile(String prefix, String suffix)
+ throws IOException {
+ return createTempFile(prefix, suffix, null);
+ }
+
+ /**
+ * Creates an empty temporary file in the given directory using the given
+ * prefix and suffix as part of the file name.
+ *
+ * @param prefix
+ * the prefix to the temp file name
+ * @param suffix
+ * the suffix to the temp file name
+ * @param directory
+ * the location to which the temp file is to be written, or null
+ * for the default temp location
+ * @return the temporary file
+ *
+ * @throws IOException
+ * If an error occurs when writing the file
+ */
+ public static File createTempFile(String prefix, String suffix,
+ File directory) throws IOException {
+ if (prefix != null) {
+ if (prefix.length() >= 3) {
+ String newSuffix = suffix == null ? ".tmp" : suffix; //$NON-NLS-1$
+ String tmpDir = "."; //$NON-NLS-1$
+ tmpDir = AccessController.doPrivileged(new PriviAction<String>("java.io.tmpdir", ".")); //$NON-NLS-1$//$NON-NLS-2$
+ File result, tmpDirFile = directory == null ? new File(tmpDir)
+ : directory;
+ do {
+ result = genTempFile(prefix, newSuffix, tmpDirFile);
+ } while (!result.createNewFile());
+ return result;
+ }
+ throw new IllegalArgumentException(org.apache.harmony.luni.util.Msg
+ .getString("K006b")); //$NON-NLS-1$
+ }
+ throw new NullPointerException();
+ }
+
+ private static File genTempFile(String prefix, String suffix, File directory) {
+ if (counter == 0) {
+ int newInt = new java.util.Random().nextInt();
+ counter = ((newInt / 65535) & 0xFFFF) + 0x2710;
+ }
+ StringBuilder newName = new StringBuilder();
+ newName.append(prefix);
+ newName.append(counter++);
+ newName.append(suffix);
+ return new File(directory, newName.toString());
+ }
+
+ /**
+ * Answer a String representing the proper path for the receiver. If the
+ * receiver is absolute do not prepend the user.dir property, otherwise do.
+ *
+ * @param internal
+ * is user.dir internal
+ * @return the proper path
+ */
+ byte[] properPath(boolean internal) {
+ if (properPath != null)
+ return properPath;
+ byte[] pathBytes = org.apache.harmony.luni.util.Util.getBytes(path);
+ if (isAbsoluteImpl(pathBytes))
+ return properPath = pathBytes;
+ // Check security by getting user.dir when the path is not absolute
+ String userdir;
+ if (internal) {
+ userdir = AccessController.doPrivileged(new PriviAction<String>("user.dir")); //$NON-NLS-1$
+ } else
+ userdir = System.getProperty("user.dir"); //$NON-NLS-1$
+ if ((properPath = properPathImpl(pathBytes)) != null)
+ return properPath;
+ if (path.length() == 0)
+ return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir);
+ int length = userdir.length();
+ if (path.charAt(0) == '\\') {
+ if (length > 1 && userdir.charAt(1) == ':') {
+ return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir
+ .substring(0, 2)
+ + path);
+ }
+ if (length > 0 && userdir.charAt(length - 1) == separatorChar) {
+ return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir
+ + path.substring(1));
+ }
+ return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir + path);
+ }
+ if (length > 0 && userdir.charAt(length - 1) == separatorChar) {
+ return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir + path);
+ }
+ return properPath = org.apache.harmony.luni.util.Util.getBytes(userdir + separator
+ + path);
+ }
+
+ private static native byte[] properPathImpl(byte[] path);
+
+ /**
+ * Renames this File to the name represented by the File <code>dest</code>.
+ * This works for both normal files and directories.
+ *
+ * @param dest
+ * the File containing the new name.
+ * @return <code>true</code> if the File was renamed, <code>false</code>
+ * otherwise.
+ *
+ * @see #getPath
+ * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+ * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
+ */
+ public boolean renameTo(java.io.File dest) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkWrite(path);
+ security.checkWrite(dest.path);
+ }
+ return renameToImpl(properPath(true), dest.properPath(true));
+ }
+
+ private native boolean renameToImpl(byte[] pathExist, byte[] pathNew);
+
+ /**
+ * Answers a string containing a concise, human-readable description of the
+ * receiver.
+ *
+ * @return a printable representation for the receiver.
+ */
+ public String toString() {
+ return path.toString();
+ }
+
+ /**
+ * Answers a <code>file</code> URI for this File. The URI is System
+ * dependent and may not be transferable between different operating/file
+ * systems.
+ *
+ * @return a <code>file</code> URI for this File.
+ */
+ public URI toURI() {
+ String name = getAbsoluteName();
+ try {
+ if (!name.startsWith("/")) // On Windows, absolute paths might not //$NON-NLS-1$
+ // start with sep.
+ return new URI("file", null, //$NON-NLS-1$
+ new StringBuilder(name.length() + 1).append('/').append(
+ name).toString(), null, null);
+ else if (name.startsWith("//")) //$NON-NLS-1$
+ return new URI("file", name, null); // UNC path //$NON-NLS-1$
+ return new URI("file", null, name, null, null); //$NON-NLS-1$
+ } catch (URISyntaxException e) {
+ // this should never happen
+ return null;
+ }
+ }
+
+ /**
+ * Answers a <code>file</code> URL for this File. The URL is System
+ * dependent and may not be transferable between different operating/file
+ * systems.
+ *
+ * @return a <code>file</code> URL for this File.
+ *
+ * @throws java.net.MalformedURLException
+ * if the path cannot be transformed into an URL
+ */
+ public URL toURL() throws java.net.MalformedURLException {
+ String name = getAbsoluteName();
+ if (!name.startsWith("/")) // On Windows, absolute paths might not //$NON-NLS-1$
+ // start with sep.
+ return new URL("file", "", -1, new StringBuilder(name.length() + 1) //$NON-NLS-1$ //$NON-NLS-2$
+ .append('/').append(name).toString(), null);
+ else if (name.startsWith("//")) //$NON-NLS-1$
+ return new URL("file:" + name); // UNC path //$NON-NLS-1$
+ return new URL("file", "", -1, name, null); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private String getAbsoluteName() {
+ String name = getAbsolutePath();
+ if (isDirectory() && name.charAt(name.length() - 1) != separatorChar) {
+ // Directories must end with a slash
+ name = new StringBuilder(name.length() + 1).append(name)
+ .append('/').toString();
+ }
+ if (separatorChar != '/') { // Must convert slashes.
+ name = name.replace(separatorChar, '/');
+ }
+ return name;
+ }
+
+ private void writeObject(ObjectOutputStream stream) throws IOException {
+ stream.defaultWriteObject();
+ stream.writeChar(separatorChar);
+
+ }
+
+ private void readObject(ObjectInputStream stream) throws IOException,
+ ClassNotFoundException {
+ stream.defaultReadObject();
+ char inSeparator = stream.readChar();
+ path = path.replace(inSeparator, separatorChar);
+ }
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/File.java
------------------------------------------------------------------------------
svn:eol-style = native