这是我编写的一些代码,用于读取和写入适用于我的文件系统。请注意,fileWriter 将传回文件的绝对路径,但文件读取器需要相对路径,因此底部的 getRelativePathToFile 方法。
function onPlayerStateChange(evt) {
if (evt.data == YT.PlayerState.PLAYING && !done) { // NEED TO ADD FILE OPERATION HERE
PG.saveToDisk('youTubeStateChange.txt', 'on player state change',
function (pathToFile){
alert('file written to ' + pathToFile);
}
);
setTimeout(stopVideo, 6000);
done = true;
}
}
// make error codes meaningful
PG.FileErrors = {
1: 'File not found',
2: 'Security error',
3: 'Action Aborted',
4: 'File not readable',
5: 'Encoding error',
6: 'No modification allowed',
7: 'Invalid state error',
8: 'Syntax error',
9: 'Invalid modification error',
10: 'Quota Exceeded',
11: 'Type mismatch',
12: 'Path exists'
};
// writes a file to the fileSystem
// and sets the path to the file
// which can be used in the callback
// @param {} fileContent
// @param {string} fileName
// @param {function} callback
PG.saveToDisk = function (fileContent, fileName, callback){
var pathToFile,
accessFileSystem = window.requestFileSystem;
// something went wrong..
function fail (error){
console.log('-- saveToDisk: error ' + error + ' ' + PG.FileErrors[error.code]);
}
// finally write to a file
function gotFileWriter (writer){
console.log('-- saveToDisk: gotFileWriter');
// ..yaay! it worked
writer.onwrite = function (event){
if(typeof callback == 'function'){
console.log('-- saveToDisk: calling back');
callback.call(this, pathToFile);
}
};
// working it..
writer.write(fileContent);
delete gotFileWriter;
}
// now that we have a location
// on disk we can write to it..
function gotFileEntry (fileEntry){
console.log('-- saveToDisk: gotFileEntry');
pathToFile = fileEntry.toURI();
// ..not quite
fileEntry.createWriter(gotFileWriter, fail);
delete gotFileEntry;
}
// get file for writing
function getFileSystem (fileSystem){
console.log('-- saveToDisk: getFileSystem');
fileSystem.root.getFile(fileName, {create: true, exclusive: false}, gotFileEntry, fail);
delete getFileSystem;
}
if(typeof accessFileSystem != 'undefined'){
console.log('-- saveToDisk: accessed file system');
accessFileSystem(LocalFileSystem.PERSISTENT, 0, getFileSystem, fail);
// clean up as we go to save space in
// call stack and prevent 'call stack
// size exceeded' error
delete accessFileSystem;
} else {
console.log('-- saveToDisk: no requestFileSystem so exiting');
}
};
// get a file at a source from
// disk and pass it to callback
// @param {function} callback
PG.getFromDisk = function (source, callback){
var accessFileSystem = window.requestFileSystem;
// something went wrong..
function fail (error){
console.log('-- getFromDisk: error ' + PG.FileErrors[error.code]);
}
//we read it
// @param {string} method
// defaults to text unless image is specified
function readData (file, method){
console.log('readDataUrl');
var reader = new FileReader(),
method = method == 'image' ? 'readAsDataURL' : 'readAsText';
reader.onloadend = function (event){
if(typeof callback == 'function'){
console.log('-- getFromDisk: calling back');
callback.call(this, event.target.result);
}
};
reader[method](file);
}
// what do we do with the file?
function gotFile (file){
console.log('-- gotFile');
readData(file);
}
// get the file
function gotFileEntry (fileEntry){
console.log('-- gotFileEntry');
fileEntry.file(gotFile, fail);
}
// get file reader
function getFileSystem (fileSystem){
console.log('-- getFileSystem: ' + source);
fileSystem.root.getFile(source, null, gotFileEntry, fail);
}
// why did the fileSystem cross the road?
// so it could callback 4 times!
if(typeof accessFileSystem != 'undefined'){
accessFileSystem(LocalFileSystem.PERSISTENT, 0, getFileSystem, fail);
} else {
console.log('-- getFromDisk: no requestFileSystem so exiting');
}
};
// get relative path to saved file
// because that is what the file
// reader needs
// @param {string} pathToFile
PG.getRelativePathToFile = function (pathToFile){
if(/localhost|mnt/.exec(pathToFile)){
var root = /localhost|mnt/.exec(pathToFile)[0];
pathToFile = pathToFile.substring(pathToFile.indexOf(root));
pathToFile = pathToFile.substring(pathToFile.indexOf('/'));
}
console.log('-- getRelativePathToFile: pathToFile = ' + pathToFile);
return pathToFile;
};