我越来越混淆如何递归地读取文件列表。 假设我的filesytem api根目录中有3个文本文件
我的目标是逐个读取每个文本文件,然后将每个文件中的所有条目连接成一个字符串,但我目前正在丢失 如何在Javascript FileSystem API中执行此操作。
window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
function onInitFs(fs) {
var dirReader = fs.root.createReader();
var entries = [];
// Call the reader.readEntries() until no more results are returned.
var readEntries = function() {
dirReader.readEntries (function(results) {
if (!results.length) {
readAllFiles(results);
} else {
entries = entries.concat(toArray(results));
readEntries();
}
}, errorHandler);
};
readEntries(); // Start reading dirs.
}
function readAllFiles(entries){
//Loop thru all the files and read each entries
}
我已经看过如何读取一个文本文件,但我不知道如何实现所有文件的读取并连接值。 它们都实现了回调函数,所以我对如何处理它感到困惑。有什么要点吗?
我实际上已将所有作品都放在http://www.html5rocks.com/en/tutorials/file/filesystem
中更新2 按@Johan 我实际上改变了我的代码以使用回调
window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
function onInitFs(fs) {
var dirReader = fs.root.createReader();
var entries = [];
// Call the reader.readEntries() until no more results are returned.
var readEntries = function() {
dirReader.readEntries (function(results) {
if (!results.length) {
readAllFiles(results, concatMessages);
} else {
entries = entries.concat(toArray(results));
readEntries();
}
}, errorHandler);
};
readEntries(); // Start reading dirs.
}
var concatMessage = '';
function concatMessages(message){
concatMessage += message;
}
function readAllFiles(logs, callBack) {
logs.forEach(function(entry, iCtr) {
var message;
entry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(e) {
//message += this.result;
if(callBack)
callBack('==================' + iCtr + '==========================');
callBack(this.result);
};
reader.readAsText(file); // Read the file as plaintext.
}, function(err) {
console.log(err);
});
});
}
我唯一的问题是,回调函数不是顺序的。 它首先读取text2.txt然后是text3.txt然后是text1.txt,所以最终结果不是顺序的,这不是我想要做的。还有其他提示吗?
答案 0 :(得分:0)
强烈建议您考虑使用类似caolan的async库来完成此任务。
您可以这样做:
async.each(openFiles, function(file, callback) {
// Perform operation on file here.
console.log('Processing file ' + file);
callback();
}, function(err) {
// if any of the file processing produced an error, err would equal that error
if (err) {
// One of the iterations produced an error.
// All processing will now stop.
console.log('A file failed to process');
} else {
// do your concatenation here
}
});