我找不到这个场景的任何例子,所以我们走了:
我希望用户选择一个目录,加载其中的所有文件,更改它们,并保存此文件覆盖它或将新文件保存在同一目录中,而不询问他想要保存的位置.
我相信这是可能的,因为我在这里看到类似的东西(最后一段):http: //www.developer.com/lang/using-the-file-api-outside-the-sandbox-in-chrome-packaged-apps. HTML
任何答案将不胜感激,谢谢
编辑:感谢克里斯约翰森给我这个伟大的答案:
var fileHandler = function() {
var _entry = null;
this.open = function(cb) {
chrome.fileSystem.chooseEntry({
type: 'openDirectory'
}, function(dirEntry) {
if (!dirEntry || !dirEntry.isDirectory) {
cb && cb(null);
return;
}
_entry = dirEntry;
listDir(_entry, cb);
});
};
this.save = function(filename, source) {
chrome.fileSystem.getWritableEntry(_entry, function(entry) {
entry.getFile(filename, {
create: true
}, function(entry) {
entry.createWriter(function(writer) {
writer.onwrite = function() {
writer.onwrite = null;
writer.truncate(writer.position);
};
writer.write(new Blob([source], {
type: 'text/javascript'
}));
});
});
});
};
this.saveAs = function(filename, source) {
chrome.fileSystem.chooseEntry({
type: 'openDirectory'
}, function(entry) {
chrome.fileSystem.getWritableEntry(entry, function(entry) {
entry.getFile(filename, {
create: true
}, function(entry) {
entry.createWriter(function(writer) {
writer.onwrite = function() {
writer.onwrite = null;
writer.truncate(writer.position);
};
writer.write(new Blob([source], {
type: 'text/javascript'
}));
});
});
});
});
};
var listDir = function(dirent, cb, listing) {
if (listing === undefined) {
listing = [];
}
var reader = dirent.createReader();
var read_some = reader.readEntries.bind(reader, function(ents) {
if (ents.length === 0) {
return cb && cb(listing);
}
var process_some = function(ents, i) {
for (; i < ents.length; i++) {
listing.push(ents[i]);
if (ents[i].isDirectory) {
return listDir(ents[i], process_some.bind(null, ents, i + 1), listing);
}
}
read_some();
};
process_some(ents, 0);
}, function() {
console.error('error reading directory');
});
read_some();
};
};
Run Code Online (Sandbox Code Playgroud)
你的save方法应该可以正常工作(大多数情况下见下文)以满足你的第二个要求(写一个代码选择的文件名而不需要另一个用户提示),但是有一些错误open(至少在问题中提到):
chooseEntry回调内部,this !== fileHandler因为使用不同的this(可能是后台页面的window对象)调用回调.fileHandler而不是this(如果你没有使用它作为任何类型的原型)..bind(this)到您的每一个回调函数绑定到相同的上下文.var self = this;在顶部open和使用self.entry(等等)的回调.您可能想要cb成功案例.也许你有另一种方法可以将调用推迟(例如)fileHandler.save(点击某个元素来触发保存?),但是添加类似的东西
?
cb && cb(self.entry);
?
Run Code Online (Sandbox Code Playgroud)
之后self.entry = dirEntry很容易(例如)链open和save:
fileHandler.open(function(ent) {
fileHandler.save('newfile','This is the text\nto save in the (possibly) new file.');
});
Run Code Online (Sandbox Code Playgroud)有一个潜在的错误save:如果你曾经覆盖现有文件,那么你会想要调用writer.truncate()(除非你总是写出比最初持有的文件更多的字节).
?
writer.onwrite = function() {
writer.onwrite = null;
writer.truncate(writer.position);
};
writer.write(…);
?
Run Code Online (Sandbox Code Playgroud)
看起来你在文件列表部分有一个良好的开端.如果您想稍后引用文件列表,那么您可能希望将它们保存在对象中而不是仅记录它们; 如果你想要进入子目录(并且也不假设它readEntries为第一次调用返回所有内容),这可能会有点毛茸茸.
function list_dir(dirent, cb, listing) {
if (listing === undefined) listing = [];
var reader = dirent.createReader();
var read_some = reader.readEntries.bind(reader, function(ents) {
if (ents.length === 0)
return cb && cb(listing);
process_some(ents, 0);
function process_some(ents, i) {
for(; i < ents.length; i++) {
listing.push(ents[i]);
if (ents[i].isDirectory)
return list_dir(ents[i], process_some.bind(null, ents, i + 1), listing);
}
read_some();
}
}, function() {
console.error('error reading directory');
});
read_some();
}
Run Code Online (Sandbox Code Playgroud)
您可以在open回调中使用它(假设您添加其成功回调),如下所示:
fileHandler.open(function(ent) {
ent && list_dir(ent, function(listing) {
fileHandler.listing = listing;
console.log('listing', fileHandler.listing.map(function(ent){return ent.fullPath}).join('\n'));
fileHandler.save('a_dir/somefile','This is some data.');
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3429 次 |
| 最近记录: |