|
|
|
@@ -61,10 +61,10 @@ public class FileUtils { |
|
|
|
private static Random rand = new Random(System.currentTimeMillis() |
|
|
|
+ Runtime.getRuntime().freeMemory()); |
|
|
|
|
|
|
|
private static final boolean onNetWare = Os.isFamily("netware"); |
|
|
|
private static final boolean onDos = Os.isFamily("dos"); |
|
|
|
private static final boolean onWin9x = Os.isFamily("win9x"); |
|
|
|
private static final boolean onWindows = Os.isFamily("windows"); |
|
|
|
private static final boolean ON_NETWARE = Os.isFamily("netware"); |
|
|
|
private static final boolean ON_DOS = Os.isFamily("dos"); |
|
|
|
private static final boolean ON_WIN9X = Os.isFamily("win9x"); |
|
|
|
private static final boolean ON_WINDOWS = Os.isFamily("windows"); |
|
|
|
|
|
|
|
static final int BUF_SIZE = 8192; |
|
|
|
|
|
|
|
@@ -186,24 +186,31 @@ public class FileUtils { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Convenience method to copy a file from a source to a destination specifying if token |
|
|
|
* filtering must be used, if source files may overwrite newer destination files and the last |
|
|
|
* modified time of <code>destFile</code> file should be made equal to the last modified time |
|
|
|
* Convenience method to copy a file from a source to a destination |
|
|
|
* specifying if token |
|
|
|
* filtering must be used, if source files may overwrite newer destination |
|
|
|
* files and the last |
|
|
|
* modified time of <code>destFile</code> file should be made equal to |
|
|
|
* the last modified time |
|
|
|
* of <code>sourceFile</code>. |
|
|
|
* |
|
|
|
* @param sourceFile Name of file to copy from. Must not be <code>null</code>. |
|
|
|
* @param destFile Name of file to copy to. Must not be <code>null</code>. |
|
|
|
* @param filters the collection of filters to apply to this copy. |
|
|
|
* @param overwrite Whether or not the destination file should be overwritten if it already |
|
|
|
* exists. |
|
|
|
* @param preserveLastModified Whether or not the last modified time of the resulting file |
|
|
|
* @param overwrite Whether or not the destination file should be |
|
|
|
* overwritten if it already exists. |
|
|
|
* @param preserveLastModified Whether or not the last modified time of |
|
|
|
* the resulting file |
|
|
|
* should be set to that of the source file. |
|
|
|
* |
|
|
|
* @throws IOException if the copying fails. |
|
|
|
*/ |
|
|
|
public void copyFile(String sourceFile, String destFile, FilterSetCollection filters, |
|
|
|
boolean overwrite, boolean preserveLastModified) throws IOException { |
|
|
|
copyFile(new File(sourceFile), new File(destFile), filters, overwrite, preserveLastModified); |
|
|
|
public void copyFile(String sourceFile, String destFile, |
|
|
|
FilterSetCollection filters, |
|
|
|
boolean overwrite, boolean preserveLastModified) |
|
|
|
throws IOException { |
|
|
|
copyFile(new File(sourceFile), new File(destFile), filters, overwrite, |
|
|
|
preserveLastModified); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@@ -536,7 +543,7 @@ public class FileUtils { |
|
|
|
* @since Ant 1.7 |
|
|
|
*/ |
|
|
|
public static boolean isContextRelativePath(String filename) { |
|
|
|
if (!(onDos || onNetWare) || filename.length() == 0) { |
|
|
|
if (!(ON_DOS || ON_NETWARE) || filename.length() == 0) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
char sep = File.separatorChar; |
|
|
|
@@ -567,11 +574,11 @@ public class FileUtils { |
|
|
|
char sep = File.separatorChar; |
|
|
|
filename = filename.replace('/', sep).replace('\\', sep); |
|
|
|
char c = filename.charAt(0); |
|
|
|
if (!(onDos || onNetWare)) { |
|
|
|
if (!(ON_DOS || ON_NETWARE)) { |
|
|
|
return (c == sep); |
|
|
|
} |
|
|
|
if (c == sep) { |
|
|
|
if (!(onDos && len > 4 && filename.charAt(1) == sep)) { |
|
|
|
if (!(ON_DOS && len > 4 && filename.charAt(1) == sep)) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
int nextsep = filename.indexOf(sep, 2); |
|
|
|
@@ -580,7 +587,7 @@ public class FileUtils { |
|
|
|
int colon = filename.indexOf(':'); |
|
|
|
return (Character.isLetter(c) && colon == 1 |
|
|
|
&& filename.length() > 2 && filename.charAt(2) == sep) |
|
|
|
|| (onNetWare && colon > 0); |
|
|
|
|| (ON_NETWARE && colon > 0); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@@ -687,7 +694,7 @@ public class FileUtils { |
|
|
|
} |
|
|
|
String root = null; |
|
|
|
int colon = path.indexOf(':'); |
|
|
|
if (colon > 0 && (onDos || onNetWare)) { |
|
|
|
if (colon > 0 && (ON_DOS || ON_NETWARE)) { |
|
|
|
|
|
|
|
int next = colon + 1; |
|
|
|
root = path.substring(0, next); |
|
|
|
@@ -1188,34 +1195,40 @@ public class FileUtils { |
|
|
|
* two files to be considered to have different timestamps. |
|
|
|
*/ |
|
|
|
public long getFileTimestampGranularity() { |
|
|
|
if (onWin9x) { |
|
|
|
if (ON_WIN9X) { |
|
|
|
return FAT_FILE_TIMESTAMP_GRANULARITY; |
|
|
|
} |
|
|
|
if (onWindows) { |
|
|
|
if (ON_WINDOWS) { |
|
|
|
return NTFS_FILE_TIMESTAMP_GRANULARITY; |
|
|
|
} |
|
|
|
if (onDos) { |
|
|
|
if (ON_DOS) { |
|
|
|
return FAT_FILE_TIMESTAMP_GRANULARITY; |
|
|
|
} |
|
|
|
return UNIX_FILE_TIMESTAMP_GRANULARITY; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* test whether a file or directory exists, with an error in the upper/lower case spelling of the name. |
|
|
|
* Using this method is only interesting on case insensitive file systems (Windows).<br/> |
|
|
|
* test whether a file or directory exists, with an error in the |
|
|
|
* upper/lower case spelling of the name. |
|
|
|
* Using this method is only interesting on case insensitive file systems |
|
|
|
* (Windows).<br/> |
|
|
|
* It will return true only if 3 conditions are met : |
|
|
|
* <br/> |
|
|
|
* <ul> |
|
|
|
* <li>operating system is case insensitive</li> |
|
|
|
* <li>file exists</li> |
|
|
|
* <li>actual name from directory reading is different from the supplied argument</li> |
|
|
|
* <li>actual name from directory reading is different from the |
|
|
|
* supplied argument</li> |
|
|
|
* </ul> |
|
|
|
* <br/> |
|
|
|
* the purpose is to identify files or directories on case-insensitive filesystems whose case is not what is expected.<br/> |
|
|
|
* Possibly to rename them afterwards to the desired upper/lowercase combination. |
|
|
|
* the purpose is to identify files or directories on case-insensitive |
|
|
|
* filesystems whose case is not what is expected.<br/> |
|
|
|
* Possibly to rename them afterwards to the desired upper/lowercase |
|
|
|
* combination. |
|
|
|
* <br/> |
|
|
|
* @param localFile file to test |
|
|
|
* @return true if the file exists and the case of the actual file is not the case of the parameter |
|
|
|
* @return true if the file exists and the case of the actual file |
|
|
|
* is not the case of the parameter |
|
|
|
* @since Ant 1.7.1 |
|
|
|
*/ |
|
|
|
public boolean hasErrorInCase(File localFile) { |
|
|
|
@@ -1400,10 +1413,14 @@ public class FileUtils { |
|
|
|
} |
|
|
|
|
|
|
|
int minLength = Math.min(fromPathStack.length, toPathStack.length); |
|
|
|
int same = 1; |
|
|
|
int same = 1; // Used outside the for loop |
|
|
|
|
|
|
|
// get index of parts which are equal |
|
|
|
for (; same < minLength && fromPathStack[same].equals(toPathStack[same]); same++); |
|
|
|
for (; |
|
|
|
same < minLength && fromPathStack[same].equals(toPathStack[same]); |
|
|
|
same++) { |
|
|
|
// Do nothing |
|
|
|
} |
|
|
|
|
|
|
|
List relativePathStack = new ArrayList(); |
|
|
|
|
|
|
|
|