- lectura y manipulación de archivos (
File
/Blob
,FileList
,FileReader
), - creación y escritura (
BlobBuilder
,FileWriter
), - acceso a sistemas de archivos y directorios (
DirectoryReader
,FileEntry
/DirectoryEntry
,LocalFileSystem
).
Solicitud de un sistema de archivos
Una aplicación web puede solicitar acceso al sistema de archivos de prueba conwindow.requestFileSystem()
:window.requestFileSystem(type, size, successCallback, opt_errorCallback)
- type:
Indica si el almacenamiento de archivos debe ser
permanente. Los valores que se pueden utilizar son
window.TEMPORARY
ywindow.PERSISTENT
. Los datos almacenados con el tipoTEMPORARY
se pueden eliminar a elección del navegador. Los datos almacenados con el tipoPERSISTENT
no se pueden borrar a menos que el usuario o la aplicación lo autoricen expresamente y requieren que el usuario otorgue espacio de almacenamiento a la aplicación.
-
- size: Indica el espacio (en bytes) de almacenamiento que necesitará la aplicación.
-
- successCallback. Indica la devolución de llamada que se activa cuando se autoriza el acceso a un sistema de archivos. Su argumento es un objeto
FileSystem
. - successCallback. Indica la devolución de llamada que se activa cuando se autoriza el acceso a un sistema de archivos. Su argumento es un objeto
-
- opt_errorCallback: Corresponde a una devolución de llamada opcional para la gestión de errores o para los casos en los que se deniega la solicitud de acceso al sistema de archivos. Su argumento es un objeto
FileError
. - opt_errorCallback: Corresponde a una devolución de llamada opcional para la gestión de errores o para los casos en los que se deniega la solicitud de acceso al sistema de archivos. Su argumento es un objeto
Cómo crear un archivo
Para buscar o crear archivos, se puede utilizar el métodogetFile()
de la interfaz DirectoryEntry
del sistema de archivos. Una vez que se ha solicitado un sistema de
archivos, se transmite a la devolución de llamada de operación
correcta un objeto FileSystem
que
contiene una interfaz DirectoryEntry
(fs.root
) que señala al directorio raíz
del sistema de archivos de la aplicación.window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
function onInitFs(fs) {
fs.root.getFile('log.txt', {create: true, exclusive: true}, function(fileEntry) {
// fileEntry.isFile === true
// fileEntry.name == 'log.txt'
// fileEntry.fullPath == '/log.txt'
}, errorHandler);
}
Una vez que se ha solicitado el sistema de archivos, se transmite un objeto
FileSystem
al controlador de
operación correcta. Dentro de la devolución de llamada, se puede
solicitar fs.root.getFile()
indicando el
nombre del archivo que se va a crear. Se puede especificar una ruta
absoluta o relativa, pero debe ser una ruta válida. Por ejemplo, es
un error intentar crear un archivo cuyo elemento inmediatamente
anterior no exista. El segundo argumento de getFile()
es una cadena literal de objeto que describe el comportamiento que
debe tener la función si el archivo no existe. En este ejemplo,
create: true
hace que se cree el archivo
si no existe y que se genere un error en caso contrario (exclusive:
true
). Por su parte, create: false
hace que el archivo simplemente se extraiga y se muestre. En ambos
casos, el contenido del archivo no se sobrescribe, ya que solo se
está obteniendo una entrada de referencia al archivo en cuestión.
Cómo leer un archivo por nombre
El código que aparece a continuación permite recuperar el archivo "log.txt", leer su contenido con el APIFileReader
e incorporarlo a una nueva área de texto (<textarea>) en la
página. Si el archivo "log.txt" no existe, se genera un
error.function onInitFs(fs) {
fs.root.getFile('log.txt', {}, function(fileEntry) {
// Get a File object representing the file,
// then use FileReader to read its contents.
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(e) {
var txtArea = document.createElement('textarea');
txtArea.value = this.result;
document.body.appendChild(txtArea);
};
reader.readAsText(file);
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
Cómo escribir en un archivo
El código que aparece a continuación permite crear un archivo vacío llamado "log.txt" (en caso de que no exista) y escribir en él el texto "Lorem Ipsum".window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
function onInitFs(fs) {
fs.root.getFile('log.txt', {create: true}, function(fileEntry) {
// Create a FileWriter object for our FileEntry (log.txt).
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function(e) {
console.log('Write completed.');
};
fileWriter.onerror = function(e) {
console.log('Write failed: ' + e.toString());
};
// Create a new Blob and write it to log.txt.
var bb = new BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
bb.append('Lorem Ipsum');
fileWriter.write(bb.getBlob('text/plain'));
}, errorHandler);
}, errorHandler);
}
Esta vez, se utiliza el método
createWriter()
de FileEntry para obtener un objeto FileWriter
.
Dentro de la devolución de llamada de operación correcta, se
definen controladores para los eventos error
y writeend
. Para escribir los datos del
texto en el archivo, se crea un objeto Blob, se le añade texto y se
transmite el objeto a FileWriter.write()
.
Cómo añadir datos a un archivo
El código que aparece a continuación permite añadir el texto "Hello World" al final del archivo de registro. Si el archivo no existe, se genera un error.window.requestFileSystem(window.TEMPORARY,1024*1024, onInitFs, errorHandler);
function onInitFs(fs) {
fs.root.getFile('log.txt',{create: false}, function(fileEntry) {
// Create aFileWriter 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();
bb.append('Hello World');
fileWriter.write(bb.getBlob('text/plain'));
}, errorHandler);
}, errorHandler);
}
Cómo eliminar un archivo
El código que aparece a continuación permite eliminar el archivo "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);
Cómo copiar entradas, cambiarles el nombre y moverlas
Las interfacesFileEntry
y
DirectoryEntry
comparten algunas
operaciones.Cómo copiar una entrada
TantoFileEntry
como DirectoryEntry
cuentan con el método copyTo()
para la
duplicación de entradas. Este método permite hacer una copia
recurrente en diferentes carpetas.El código del ejemplo que aparece a continuación permite copiar el archivo "me.png" de un directorio en otro:
function copy(cwd, src, dest) {
cwd.getFile(src, {}, function(fileEntry) {
cwd.getDirectory(dest, {}, function(dirEntry) {
fileEntry.copyTo(dirEntry);
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
copy(fs.root, '/folder1/me.png', 'folder2/mypics/');
}, errorHandler);
Cómo mover una entrada o cambiarle el nombre
El métodomoveTo()
de FileEntry
y DirectoryEntry
permite mover archivos
y directorios y cambiarles el nombre. El primer argumento especifica
el directorio principal al que se debe mover el archivo y el segundo
argumento indica un nuevo nombre opcional para el archivo. Si no se
especifica un nombre nuevo, se utilizará el nombre original del
archivo.El código de ejemplo que aparece a continuación permite sustituir el nombre del archivo "me.png" por "you.png" sin mover el archivo:
function rename(cwd, src, newName) {
cwd.getFile(src, {}, function(fileEntry) {
fileEntry.moveTo(cwd, newName);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
rename(fs.root, 'me.png', 'you.png');
}, errorHandler);
El código de ejemplo que aparece a continuación permite mover el archivo "me.png" (ubicado en el directorio raíz) a una carpeta llamada "newfolder".
function move(src, dirName) {
fs.root.getFile(src, {}, function(fileEntry) {
fs.root.getDirectory(dirName, {}, function(dirEntry) {
fileEntry.moveTo(dirEntry);
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
move('/me.png', 'newfolder/');
}, errorHandler);
No hay comentarios:
Publicar un comentario