Comunidad de diseño web y desarrollo en internet

Abrir y leer archivos de texto del disco duro con Adobe AIR

Hola, aquí dejo un listado de código para leer un archivo del disco según el modelo AIR para Flash CS3.
Los ingredientes a tener en el escenario:

  • 1 clip cerrar_mc
  • 1 clip cargar_mc
  • 1 campo de texto texto_txt

Importamos las clases necesarias para el manejo de archivos con AIR:

Código :

import flash.net.FileFilter;
import flash.filesystem.*;

Importamos unas clases para detectar eventos y eventos del mouse:

Código :

import flash.events.Event;
import flash.events.MouseEvent;

definimos el objeto archivo:

Código :

var archivo:File = new File();

definimos un filtro de archivos, e.g. en el cuadro de diálogo nos va a mostrar sólo archivos de este tipo:

Código :

var tipoArchivo:FileFilter = new FileFilter("Archivos de texto", "*.as;*.css;*.html;*.txt;*.xml");

ahora nada interesante, sólo eventos del mouse y que nos ponga la manito cuando pasemos encima de los clips:

Código :

cargar_mc.useHandCursor = cerrar_mc.useHandCursor = true;
cargar_mc.addEventListener(MouseEvent.CLICK, cargar);
cerrar_mc.addEventListener(MouseEvent.CLICK, cerrar);
this.stage.addEventListener(MouseEvent.MOUSE_DOWN, arrastrar);

al hacer click en el escenario, arrastramos la ventana, naturalmente va a arrastrar desde cualquier parte que hagamos click, aún encima del campo de texto. En la documentación se detalla cómo definir este comportamiento, pero a fines de sencillez queda así:

Código :

function arrastrar(e:MouseEvent) {
   this.stage.nativeWindow.startMove();
}

al hacer click en el clip cerrar, cierra la ventana AIR:

Código :

function cerrar(e:MouseEvent) {
   this.stage.nativeWindow.close();
}

al hacer click en el clip cargar, pasan varias cosas:

Código :

function cargar(e:MouseEvent) {

Con el siguiente método llamamos al cuadro del diálogo Abrir del sistema, le pondremos de título a la ventana "Abrir archivo..." y mostraremos únicamente los tipos de archivos especificados anteriormente con el array FileFilter:

Código :

        archivo.browseForOpen("Abrir archivo...", [tipoArchivo]);

Cuando seleccionemos y abramos un archivo, se lanzará la función abrirArchivo:

Código :

   archivo.addEventListener(Event.SELECT, abrirArchivo);
   
   function abrirArchivo(e:Event):void {

ya dentro de abrirArchivo, declaramos un puntero al archivo:

Código :

      var puntero:FileStream = new FileStream();

Esta es la parte más curiosa. Abrimos el puntero pasándole como parámetro el archivo seleccionado al momento que se lanzó el evento SELECT. Este objeto está dentro del evento e, en la propiedad target sin embargo, si sólo lo llamamos e.target, lo toma como un objeto y no como un objeto FILE, es por eso es que le pondremos 'e.target as File'. Abrimos el flujo en modo de lectura.

Código :

      puntero.open(e.target as File, FileMode.READ);

y lo volcamos a una string en unicode:

Código :

      var datosArchivo:String = puntero.readUTFBytes(puntero.bytesAvailable);

Finalmente, lo cargamos en el campo de texto

Código :

      texto_txt.text = datosArchivo;
   }
}

A continuación el código completo:

Código :

import flash.filesystem.*;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.FileFilter;

var archivo:File = new File();
var tipoArchivo:FileFilter = new FileFilter("Archivos de texto", "*.as;*.css;*.html;*.txt;*.xml");

cargar_mc.useHandCursor = cerrar_mc.useHandCursor = true;
cargar_mc.addEventListener(MouseEvent.CLICK, cargar);
cerrar_mc.addEventListener(MouseEvent.CLICK, cerrar);
this.stage.addEventListener(MouseEvent.MOUSE_DOWN, arrastrar);

function arrastrar(e:MouseEvent) {   this.stage.nativeWindow.startMove();   }
function cerrar(e:MouseEvent) {      this.stage.nativeWindow.close();   }
function cargar(e:MouseEvent) {
   archivo.browseForOpen("Abrir archivo...", [tipoArchivo]);
   archivo.addEventListener(Event.SELECT, abrirArchivo);
   function abrirArchivo(e:Event):void {
      var puntero:FileStream = new FileStream();
      puntero.open(e.target as File, FileMode.READ);
      var datosArchivo:String = puntero.readUTFBytes(puntero.bytesAvailable);
      texto_txt.text = datosArchivo;
   }
}


Espero que lo disfruten, saludos.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate