此时,我们会调用 FileEntry 的 createWriter()
方法获取 FileWriter
对象。在成功回调中为error
事件和 writeend
事件设置事件处理程序。
通过以下操作将文字数据写入文件:创建 Blob,向 Blob 附加文字,然后将 Blob 传递到FileWriter.write()
。向文件附加文字以下代码会将“Hello World”
文字附加到日志文件结尾。
如果该文件不存在,系统将引发错误。
- function onInitFs(fs) {
- fs.root.getFile('log.txt', {create: false}, function(fileEntry) {
- // Create a FileWriter object for our FileEntry (log.txt).
- fileEntry.createWriter(function(fileWriter) {
- fileWriter.seek(fileWriter.length); // Start write position at EOF.
- // Create a new Blob and write it to log.txt.
- var bb = new BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
- bb.append('Hello World');
- fileWriter.write(bb.getBlob('text/plain'));
- }, errorHandler);
- }, errorHandler);
- }
- window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
复制用户选定的文件
以下代码可让用户使用 <input type="file" multiple />
选择多个文件,并在应用的沙盒文件系统中复制这些文件。
- <input type="file" id="myfile" multiple />
- document.querySelector('#myfile').onchange = function(e) {
- var files = this.files;
- window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
- // Duplicate each file the user selected to the app's fs.
- for (var i = 0, file; file = files[i]; ++i) {
- // Capture current iteration's file in local scope for the getFile() callback.
- (function(f) {
- fs.root.getFile(file.name, {create: true, exclusive: true}, function(fileEntry) {
- fileEntry.createWriter(function(fileWriter) {
- fileWriter.write(f); // Note: write() can take a File or Blob object.
- }, errorHandler);
- }, errorHandler);
- })(file);
- }
- }, errorHandler);
- };
虽然我们通过输入导入文件,您也可以使用 HTML5 拖放功能轻松实现相同的目标。
正如评论中所说的,FileWriter.write()
可接受 Blob
或 File
。这是因为 File
继承自 Blob
,所以文件对象也是 Blob。
删除文件
以下代码会删除“log.txt”文件。
- window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
- fs.root.getFile('log.txt', {create: false}, function(fileEntry) {
- fileEntry.remove(function() {
- console.log('File removed.');
- }, errorHandler);
- }, errorHandler);
- }, errorHandler);
使用目录
沙盒中的目录通过 DirectoryEntry
接口表示,该接口共享了 FileEntry 的大部分属性(继承自常用 Entry
接口)。不过,DirectoryEntry
还可使用其他方法处理目录。
DirectoryEntry
的属性和方法:
- dirEntry.isDirectory === true
- // See the section on FileEntry for other inherited properties/methods.
- ...
- var dirReader = dirEntry.createReader();
- dirEntry.getFile(path, opt_flags, opt_successCallback, opt_errorCallback);
- dirEntry.getDirectory(path, opt_flags, opt_successCallback, opt_errorCallback);
- dirEntry.removeRecursively(successCallback, opt_errorCallback);
- ...
创建目录
使用 DirectoryEntry
的 getDirectory()
方法读取或创建目录。您可以递交名称或路径作为查找或创建所用的目录。
例如,以下代码会在根目录中创建名为“MyPictures”的目录:
- window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
- fs.root.getDirectory('MyPictures', {create: true}, function(dirEntry) {
- ...
- }, errorHandler);
- }, errorHandler);
子目录
创建子目录的方法与创建其他任何目录的方法完全相同。不过,如果您尝试创建其直接父目录不存在的目录,
API 将引发错误。相应的解决方法是,依次创建各级目录,而这对异步 API 而言非常麻烦。
以下代码会在系统创建父文件夹后以递归方式添加各个子文件夹,从而在应用相应 FileSystem 的根中创建新的层次结构 (music/genres/jazz)。
- var path = 'music/genres/jazz/';
- function createDir(rootDirEntry, folders) {
- // Throw out './' or '/' and move on to prevent something like '/foo/.//bar'.
- if (folders[0] == '.' || folders[0] == '') {
- folders = folders.slice(1);
- }
- rootDirEntry.getDirectory(folders[0], {create: true}, function(dirEntry) {
- // Recursively add the new subfolder (if we still have another to create).
- if (folders.length) {
- createDir(dirEntry, folders.slice(1));
- }
- }, errorHandler);
- };
- function onInitFs(fs) {
- createDir(fs.root, path.split('/')); // fs.root is a DirectoryEntry.
- }
- window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
在“music/genres/jazz”处于合适的位置后,我们就可以将完整路径传递到 getDirectory()
,然后在其下方创建新的子文件夹。例如:
window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
fs.root.getFile('/music/genres/jazz/song.mp3', {create: true}, function(fileEntry) {
...
}, errorHandler);
}, errorHandler);