timeless%mac.com 535b6f20f2 Bugzilla Bug 107823 change nsIFile
to use 'Modified' instead of 'Modification'
r=akkana sr=brendan


git-svn-id: svn://10.0.0.236/trunk@108891 18797224-902f-48f8-a5cc-f745e15eee43
2001-11-26 08:05:05 +00:00

702 lines
18 KiB
JavaScript

/*** -*- Mode: Javascript; tab-width: 2;
The contents of this file are subject to the Mozilla Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Collabnet code.
The Initial Developer of the Original Code is Collabnet.
Portions created by Collabnet are
Copyright (C) 2000 Collabnet. All
Rights Reserved.
Contributor(s): Pete Collins, Doug Turner, Brendan Eich, Warren Harris, Eric Plaster
File API (The purpose of this file is to make it a little easier to do file IO from js)
file.js
Function List
// Constructor
File(aPath) // creates the File object and sets the file path
open(aMode); // open a file handle for reading, writing or appending
close(); // closes a file handle
exists(); // check to see if a file exists
read(); // returns the contents of a file
readline(aDone); // returns the next line in the file. aDone == true at EOF
write(aContents, aPermissions); // permissions are optional
eof(); // check 'end of file' status
// file attributes
permissions(); // returns the files permissions
dateModified(); // returns the last modified date in locale string
size(); // returns the file size
// file string manipulation
path(); // returns the path
leaf(); // leaf is the endmost file string ex: foo.html in /myDir/foo.html
extension(); // returns a file extension if there is one
dirPath() // returns the dir part of a path
// direct manipulation
nsIFIle() // returns an nsIFile obj
// help!
help(); // currently dumps a list of available functions
Instructions:
First include this js file in your xul file. Next, create an File object:
var file = new File("/path/file.ext");
To see if the file exists, call the exists() member. This is a good check before going into some
deep code to try and extract information from a non-existant file.
To open a file for reading<"r">, writing<"w"> or appending<"a">,
just call:
file.open("w");
where in this case you will be creating a new file called '/path/file.ext', with a mode of "w"
which means you want to write a new file.
If you want to read from a file, just call:
file.open("r");
var theFilesContents = file.read();
The file contents will be returned to the caller so you can do something usefull with it.
file.close();
Calling 'close()' destroys any created objects. If you forget to use file.close() no probs
all objects are discarded anyway.
Warning: these API's are not for religious types
************/
/****************** Globals **********************/
const JSLIB_FILE = "file.js";
const JSFILE_LOCAL_CID = "@mozilla.org/file/local;1";
const JSFILE_F_CHANNEL_CID = "@mozilla.org/network/local-file-channel;1";
const JSFILE_I_STREAM_CID = "@mozilla.org/scriptableinputstream;1";
const JSFILE_I_LOCAL_FILE = "nsILocalFile";
const JSFILE_I_FILE_CHANNEL = "nsIFileChannel";
const JSFILE_I_SCRIPTABLE_IN_STREAM = "nsIScriptableInputStream";
const JSFILE_INIT_W_PATH = "initWithPath";
const JSFILE_READ = 0x01; // 1
const JSFILE_WRITE = 0x08; // 8
const JSFILE_APPEND = 0x10; // 16
const JSFILE_READ_MODE = "r";
const JSFILE_WRITE_MODE = "w";
const JSFILE_APPEND_MODE = "a";
const JSFILE_DELETE = "delete";
const JSFILE_FILETYPE = 0x00; // 0
const JSFILE_CHUNK = 1024; // buffer for readline => set to 1k
const JSFILE_OK = true;
const JSFILE_FilePath = new Components.Constructor( JSFILE_LOCAL_CID, JSFILE_I_LOCAL_FILE, JSFILE_INIT_W_PATH);
const JSFILE_FileChannel = new Components.Constructor( JSFILE_F_CHANNEL_CID, JSFILE_I_FILE_CHANNEL );
const JSFILE_InputStream = new Components.Constructor( JSFILE_I_STREAM_CID, JSFILE_I_SCRIPTABLE_IN_STREAM );
/****************** Globals **********************/
/****************** File Object Class *********************/
function File(aPath) {
if(aPath)
this.mPath= aPath;
} // constructor
File.prototype = {
mPath : null,
mode : null,
fileInst : null,
fileChannel : null,
inputStream : null,
lineBuffer : null,
/********************* OPEN *****************************/
open : function(aSetMode)
{
if(!this.mPath)
{
dump(JSLIB_FILE+":open:ERROR: Missing member path argument\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
this.close();
if(!aSetMode)
aSetMode=JSFILE_READ_MODE;
try { this.fileInst = new JSFILE_FilePath(this.mPath); }
catch (e)
{
dump(JSLIB_FILE+":open:ERROR: UNEXPECTED"+e.name+" "+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
var fileExists = this.exists();
if(fileExists) {
if(this.fileInst.isDirectory())
{
dump(JSLIB_FILE+":open:ERROR: Can't open directory "+this.mPath+" as a file!\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
}
var retval;
switch(aSetMode)
{
case JSFILE_WRITE_MODE:
{
if(fileExists)
{
try
{
this.fileInst[JSFILE_DELETE](false);
fileExists=false;
}
catch(e)
{
dump(JSLIB_FILE+":open:ERROR: Failed to delete file "+this.mPath+"\nNS_ERROR_NUMBER: ");
this.close();
return Components.results.NS_ERROR_FAILURE;
}
}
if (!fileExists)
{
try
{
this.fileInst.create(JSFILE_FILETYPE, 0644);
fileExists=true;
}
catch(e)
{
dump(JSLIB_FILE+":open:ERROR: Failed to create file "+this.mPath+"\nNS_ERROR_NUMBER: ");
this.close();
return Components.results.NS_ERROR_FAILURE;
}
}
this.mode=JSFILE_WRITE;
retval=JSFILE_OK;
break;
}
case JSFILE_APPEND_MODE:
{
if(!fileExists)
{
try
{
this.fileInst.create(JSFILE_FILETYPE, 0644);
fileExists=true;
}
catch(e)
{
dump(JSLIB_FILE+":open:ERROR: Failed to create file "+this.mPath+"\nNS_ERROR_NUMBER: ");
this.close();
return Components.results.NS_ERROR_FAILURE;
}
}
this.mode=JSFILE_APPEND;
retval=JSFILE_OK;
break;
}
case JSFILE_READ_MODE:
{
if(!fileExists)
{
dump(JSLIB_FILE+"open:ERROR: "+this.mPath+" doesn't exist!\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE
}
try {
this.lineBuffer = new Array();
this.fileChannel = new JSFILE_FileChannel();
this.inputStream = new JSFILE_InputStream();
try { var perm = this.fileInst.permissions; }
catch(e){ perm=null; }
this.fileChannel.init(this.fileInst, JSFILE_READ, perm);
this.inputStream.init(this.fileChannel.openInputStream());
retval=JSFILE_OK;
}
catch (e)
{
dump(JSLIB_FILE+":open:ERROR: reading... "+e.name+" "+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
break;
}
default:
dump(JSLIB_FILE+":open:WARNING: \""+setMode+"\" is an Invalid file mode\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_INVALID_ARG;
}
return retval;
},
/********************* EXISTS ***************************/
exists : function ()
{
var retval = null;
try
{
var file = new JSFILE_FilePath(this.mPath);
retval=file.exists();
}
catch(e)
{
dump(JSLIB_FILE+":exists:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
return retval;
},
/********************* WRITE ****************************/
write : function(aBuffer, aPerms)
{
if(!this.fileInst)
{
dump(JSLIB_FILE+":write:ERROR: Please open a file handle first\n NS_ERROR_NUMBER:");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
if(!aBuffer)
throw(JSLIB_FILE+":write:ERROR: must have a buffer to write!\n");
if(this.mode == JSFILE_READ)
throw(JSLIB_FILE+":write:ERROR: not in write or append mode!\n");
var buffSize = aBuffer.length;
try
{
if(!this.fileChannel)
this.fileChannel = new JSFILE_FileChannel();
if(aPerms)
{
var checkPerms = this.validatePermissions(aPerms);
if(!checkPerms)
{
dump(JSLIB_FILE+":write:ERROR: invalid permissions set: "+aPerms+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_INVALID_ARG
}
}
if(!aPerms)
aPerms=0644;
this.fileChannel.init(this.fileInst, this.mode, aPerms);
try
{
this.fileInst.permissions=aPerms;
}
catch(e){ }
var outStream = this.fileChannel.openOutputStream();
outStream.write(aBuffer, buffSize);
outStream.flush();
outStream.close();
}
catch (e)
{
dump(JSLIB_FILE+":write:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
return JSFILE_OK;
},
/********************* READ *****************************/
read : function()
{
var retval = null;
try
{
if(!this.fileInst || !this.inputStream)
{
dump(JSLIB_FILE+":read:ERROR: Please open a valid file handle for reading\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
retval = this.inputStream.read(this.fileInst.fileSize);
this.inputStream.close();
}
catch (e)
{
dump(JSLIB_FILE+":read:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
return retval;
},
eof : function()
{
if(!this.fileInst || !this.inputStream)
{
dump(JSLIB_FILE+":readline:ERROR: Please open a valid file handle for reading\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
if((this.lineBuffer.length > 0) || (this.inputStream.available() > 0))
return false;
else
return JSFILE_OK;
},
/********************* READLINE *****************************/
readline : function()
{
var retval = null;
var buf = null;
try
{
if(!this.fileInst || !this.inputStream)
{
dump(JSLIB_FILE+":readline:ERROR: Please open a valid file handle for reading\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
if(this.lineBuffer.length < 2) {
buf = this.inputStream.read(JSFILE_CHUNK);
if(buf) {
var tmp = null;
if(this.lineBuffer.length == 1) {
tmp = this.lineBuffer.shift();
buf = tmp+buf;
}
this.lineBuffer = buf.split(/[\n\r]/);
}
}
retval = this.lineBuffer.shift();
}
catch (e)
{
dump(JSLIB_FILE+":readline:ERROR: "+e.name+" "+e.message+"\nNS_ERROR_NUMBER: ");
throw(e);
}
return retval;
},
/********************* PATH *****************************/
path : function () { return this.mPath; },
/********************* PATH *****************************/
/********************* LEAF *****************************/
leaf : function ()
{
if(!this.mPath)
{
dump(JSLIB_FILE+":leaf:ERROR: Missing path argument\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_INVALID_ARG;
}
if(!this.exists())
{
dump(JSLIB_FILE+":leaf:ERROR: File doesn't exist\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
var retval;
try
{
var fileInst = new JSFILE_FilePath(this.mPath);
retval=fileInst.leafName;
}
catch(e)
{
dump(JSLIB_FILE+":leaf:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
return retval;
},
/********************* VALIDATE PERMISSIONS *************/
validatePermissions : function(aNum)
{
if ( parseInt(aNum.toString(10).length) < 3 )
return false;
return JSFILE_OK;
},
/********************* PERMISSIONS **********************/
permissions : function ()
{
if(!this.mPath)
{
dump(JSLIB_FILE+":permissions:ERROR: Missing path argument\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_XPC_NOT_ENOUGH_ARGS;
}
if(!this.exists())
{
dump(JSLIB_FILE+":permissions:ERROR: File doesn't exist\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
var retval;
try
{
var fileInst = new JSFILE_FilePath(this.mPath);
retval=fileInst.permissions.toString(8);
}
catch(e)
{
dump(JSLIB_FILE+":permissions:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
return retval;
},
/********************* MODIFIED *************************/
dateModified : function ()
{
if(!this.mPath)
{
dump(JSLIB_FILE+":dateModified:ERROR: Missing path argument\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_XPC_NOT_ENOUGH_ARGS;
}
if(!this.exists())
{
dump(JSLIB_FILE+":dateModified:ERROR: File doesn't exist\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
var retval;
try
{
var fileInst = new JSFILE_FilePath(this.mPath);
var date = new Date(fileInst.lastModifiedTime).toLocaleString();
retval=date;
}
catch(e)
{
dump(JSLIB_FILE+":dateModified:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
return retval;
},
/********************* SIZE *****************************/
size : function ()
{
if(!this.mPath)
{
dump(JSLIB_FILE+":size:ERROR: Missing member path argument\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
if(!this.exists())
{
dump(JSLIB_FILE+":size:ERROR: File doesn't exist\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
var retval;
try
{
var fileInst = new JSFILE_FilePath(this.mPath);
retval = fileInst.fileSize;
}
catch(e)
{
dump(JSLIB_FILE+":size:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
return retval;
},
/********************* EXTENSION ************************/
extension : function ()
{
if(!this.mPath)
{
dump(JSLIB_FILE+":extension:ERROR: Missing member path argument\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
if(!this.exists())
{
dump(JSLIB_FILE+":extension:ERROR: File doesn't exist\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_FAILURE;
}
var retval;
try
{
var fileInst = new JSFILE_FilePath(this.mPath);
var leafName = fileInst.leafName;
var dotIndex = leafName.lastIndexOf('.');
retval=(dotIndex >= 0) ? leafName.substring(dotIndex+1) : "";
}
catch(e)
{
dump(JSLIB_FILE+":extension:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
return retval;
},
/********************* DIRPATH **************************/
dirPath : function ()
{
if(!this.mPath)
{
dump(JSLIB_FILE+":dirPath:ERROR: Missing member path argument\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
var retval;
try
{
var fileInst = new JSFILE_FilePath(this.mPath);
if(fileInst.isFile())
retval=fileInst.path.replace(this.leaf(), "");
if(fileInst.isDirectory())
retval=fileInst.path;
}
catch (e)
{
dump(JSLIB_FILE+":dirPath:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
return retval;
},
/********************* nsIFILE **************************/
nsIFile : function ()
{
if(!this.mPath)
{
dump(JSLIB_FILE+":nsIFile:ERROR: Missing member path argument\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_NOT_INITIALIZED;
}
var retval;
try
{
retval = new JSFILE_FilePath(this.mPath);
}
catch (e)
{
dump(JSLIB_FILE+":nsIFile:ERROR: "+e.name+"\n"+e.message+"\nNS_ERROR_NUMBER: ");
return Components.results.NS_ERROR_UNEXPECTED;
}
return retval;
},
/********************* HELP *****************************/
help : function()
{
var help =
"\n\nFunction List:\n" +
"\n" +
" open(aMode);\n" +
" exists();\n" +
" read();\n" +
" readline(aDone);\n" +
" write(aContents, aPermissions);\n" +
" leaf();\n" +
" permissions();\n" +
" dateModified();\n" +
" size();\n" +
" extension();\n" +
" dirPath();\n" +
" nsIFile();\n" +
" help();\n";
dump(help+"\n");
return "";
},
/********************* CLOSE ****************************/
close : function()
{
/***************** Destroy Instances *********************/
if(this.fileInst) delete this.fileInst;
if(this.fileChannel) delete this.fileChannel;
if(this.inputStream) delete this.inputStream;
if(this.mode) this.mode=null;
/***************** Destroy Instances *********************/
return JSFILE_OK;
}
};