8398c9048d
code was modified slightly, so the code differs from the original downloadable 1.9.5 version
191 lines
6.1 KiB
JavaScript
191 lines
6.1 KiB
JavaScript
//Helper functions to deal with file I/O.
|
|
|
|
var fileUtil = {};
|
|
|
|
fileUtil.getLineSeparator = function(){
|
|
//summary: Gives the line separator for the platform.
|
|
//For web builds override this function.
|
|
return java.lang.System.getProperty("line.separator"); //Java String
|
|
}
|
|
|
|
fileUtil.getFilteredFileList = function(/*String*/startDir, /*RegExp*/regExpFilters, /*boolean?*/makeUnixPaths, /*boolean?*/startDirIsJavaObject){
|
|
//summary: Recurses startDir and finds matches to the files that match regExpFilters.include
|
|
//and do not match regExpFilters.exclude. Or just one regexp can be passed in for regExpFilters,
|
|
//and it will be treated as the "include" case.
|
|
//Ignores files/directories that start with a period (.).
|
|
var files = [];
|
|
|
|
var topDir = startDir;
|
|
if(!startDirIsJavaObject){
|
|
topDir = new java.io.File(startDir);
|
|
}
|
|
|
|
var regExpInclude = regExpFilters.include || regExpFilters;
|
|
var regExpExclude = regExpFilters.exclude || null;
|
|
|
|
if(topDir.exists()){
|
|
var dirFileArray = topDir.listFiles();
|
|
for (var i = 0; i < dirFileArray.length; i++){
|
|
var file = dirFileArray[i];
|
|
if(file.isFile()){
|
|
var filePath = file.getPath();
|
|
if(makeUnixPaths){
|
|
//Make sure we have a JS string.
|
|
filePath = new String(filePath);
|
|
if(filePath.indexOf("/") == -1){
|
|
filePath = filePath.replace(/\\/g, "/");
|
|
}
|
|
}
|
|
|
|
var ok = true;
|
|
if(regExpInclude){
|
|
ok = filePath.match(regExpInclude);
|
|
}
|
|
if(ok && regExpExclude){
|
|
ok = !filePath.match(regExpExclude);
|
|
}
|
|
|
|
if(ok && !file.getName().match(/^\./)){
|
|
files.push(filePath);
|
|
}
|
|
}else if(file.isDirectory() && !file.getName().match(/^\./)){
|
|
var dirFiles = this.getFilteredFileList(file, regExpFilters, makeUnixPaths, true);
|
|
files.push.apply(files, dirFiles);
|
|
}
|
|
}
|
|
}
|
|
|
|
return files; //Array
|
|
}
|
|
|
|
|
|
fileUtil.copyDir = function(/*String*/srcDir, /*String*/destDir, /*RegExp*/regExpFilter, /*boolean?*/onlyCopyNew){
|
|
//summary: copies files from srcDir to destDir using the regExpFilter to determine if the
|
|
//file should be copied. Returns a list file name strings of the destinations that were copied.
|
|
var fileNames = fileUtil.getFilteredFileList(srcDir, regExpFilter, true);
|
|
var copiedFiles = [];
|
|
|
|
for(var i = 0; i < fileNames.length; i++){
|
|
var srcFileName = fileNames[i];
|
|
var destFileName = srcFileName.replace(srcDir, destDir);
|
|
|
|
if(fileUtil.copyFile(srcFileName, destFileName, onlyCopyNew)){
|
|
copiedFiles.push(destFileName);
|
|
}
|
|
}
|
|
|
|
return copiedFiles.length ? copiedFiles : null; //Array or null
|
|
}
|
|
|
|
fileUtil.copyFile = function(/*String*/srcFileName, /*String*/destFileName, /*boolean?*/onlyCopyNew){
|
|
//summary: copies srcFileName to destFileName. If onlyCopyNew is set, it only copies the file if
|
|
//srcFileName is newer than destFileName. Returns a boolean indicating if the copy occurred.
|
|
var destFile = new java.io.File(destFileName);
|
|
|
|
//logger.trace("Src filename: " + srcFileName);
|
|
//logger.trace("Dest filename: " + destFileName);
|
|
|
|
//If onlyCopyNew is true, then compare dates and only copy if the src is newer
|
|
//than dest.
|
|
if(onlyCopyNew){
|
|
var srcFile = new java.io.File(srcFileName);
|
|
if(destFile.exists() && destFile.lastModified() >= srcFile.lastModified()){
|
|
return false; //Boolean
|
|
}
|
|
}
|
|
|
|
//Make sure destination dir exists.
|
|
var parentDir = destFile.getParentFile();
|
|
if(!parentDir.exists()){
|
|
if(!parentDir.mkdirs()){
|
|
throw "Could not create directory: " + parentDir.getAbsolutePath();
|
|
}
|
|
}
|
|
|
|
//Java's version of copy file.
|
|
var srcChannel = new java.io.FileInputStream(srcFileName).getChannel();
|
|
var destChannel = new java.io.FileOutputStream(destFileName).getChannel();
|
|
destChannel.transferFrom(srcChannel, 0, srcChannel.size());
|
|
srcChannel.close();
|
|
destChannel.close();
|
|
|
|
return true; //Boolean
|
|
}
|
|
|
|
fileUtil.readFile = function(/*String*/path, /*String?*/encoding){
|
|
//summary: reads a file and returns a string
|
|
encoding = encoding || "utf-8";
|
|
var file = new java.io.File(path);
|
|
var lineSeparator = fileUtil.getLineSeparator();
|
|
var input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding));
|
|
try{
|
|
var stringBuffer = new java.lang.StringBuffer();
|
|
var line = input.readLine();
|
|
|
|
// Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324
|
|
// http://www.unicode.org/faq/utf_bom.html
|
|
|
|
// Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK:
|
|
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
|
|
if(line && line.length() && line.charAt(0) === 0xfeff){
|
|
// Eat the BOM, since we've already found the encoding on this file,
|
|
// and we plan to concatenating this buffer with others; the BOM should
|
|
// only appear at the top of a file.
|
|
line = line.substring(1);
|
|
}
|
|
while(line !== null){
|
|
stringBuffer.append(line);
|
|
stringBuffer.append(lineSeparator);
|
|
line = input.readLine();
|
|
}
|
|
//Make sure we return a JavaScript string and not a Java string.
|
|
return new String(stringBuffer.toString()); //String
|
|
}finally{
|
|
input.close();
|
|
}
|
|
}
|
|
|
|
fileUtil.saveUtf8File = function(/*String*/fileName, /*String*/fileContents){
|
|
//summary: saves a file using UTF-8 encoding.
|
|
fileUtil.saveFile(fileName, fileContents, "utf-8");
|
|
}
|
|
|
|
fileUtil.saveFile = function(/*String*/fileName, /*String*/fileContents, /*String?*/encoding){
|
|
//summary: saves a file.
|
|
var outFile = new java.io.File(fileName);
|
|
var outWriter;
|
|
|
|
var parentDir = outFile.getParentFile();
|
|
if(!parentDir.exists()){
|
|
if(!parentDir.mkdirs()){
|
|
throw "Could not create directory: " + parentDir.getAbsolutePath();
|
|
}
|
|
}
|
|
|
|
if(encoding){
|
|
outWriter = new java.io.OutputStreamWriter(new java.io.FileOutputStream(outFile), encoding);
|
|
}else{
|
|
outWriter = new java.io.OutputStreamWriter(new java.io.FileOutputStream(outFile));
|
|
}
|
|
|
|
var os = new java.io.BufferedWriter(outWriter);
|
|
try{
|
|
os.write(fileContents);
|
|
}finally{
|
|
os.close();
|
|
}
|
|
}
|
|
|
|
fileUtil.deleteFile = function(/*String*/fileName){
|
|
//summary: deletes a file or directory if it exists.
|
|
var file = new java.io.File(fileName);
|
|
if(file.exists()){
|
|
if(file.isDirectory()){
|
|
var files = file.listFiles();
|
|
for(var i = 0; i < files.length; i++){
|
|
this.deleteFile(files[i]);
|
|
}
|
|
}
|
|
file["delete"]();
|
|
}
|
|
}
|