Flex 3 y Air 2: detectan automáticamente cuándo se actualizan los archivos en un directorio
actionscript-3 adobe (3)
AIR puede manejar esto de forma nativa ...
la clase FileSystemList dispara un evento directoryChange cada vez que cambia un archivo en el directorio vigilado.
Incluso puedes usarlo para ver si se montan las unidades (creo que Christian Cantrell mostró eso)
Una loca idea acaba de caer del cielo y golpearme en la cabeza xD. Me preguntaba si es posible hacer que la aplicación sea capaz de escuchar cuando el usuario "agrega" nuevos archivos a un directorio.
Ejemplo:
- El usuario abre nuestra aplicación.
- El usuario agrega nuevos archivos en el escritorio (usando Microsoft Explorer).
- Nuestra aplicación detecta automáticamente que se han agregado nuevos archivos y ejecuta una función o lo que sea.
Suena interesante, ¿verdad?
Tal vez, esto podría hacerse usando un lenguaje de programación como Visual Basic y abrir el ejecutable con la aplicación NativeProcess y escuchar un evento stdOut ... (:
¿Alguien tiene una idea para compartir con nosotros? :)
Gracias Lombardi
Ok, creo que me estoy acercando, ¡mira esta solución! :)
private var CheckDelay:Timer = new Timer(5000, 0);
private function InitApp():void
{
CheckDelay.addEventListener(TimerEvent.Timer, CheckForNewFiles, false, 0, true);
CheckDelay.start();
}
private function CheckForNewFiles(event:TimerEvent):void
{
var FS:FileStream = new FileStream();
var Buffer:File = File.applicationStorageDirectory.resolvePath("FilesBuffer.cmd");
FS.open(Buffer, FileMode.Write);
FS.writeUTFBytes("cd " + File.desktopDirectory.nativePath + "/r/n" +
"dir /on /b > " + File.applicationStorageDirectory.resolvePath("FileList.txt").nativePath);
FS.close();
var Process:NativeProcess = new NativeProcess();
var NPI:NativeProcessStartupInfo = NativeProcessStartupInfo(); // What a large name! xD
NPI.executable = Buffer;
Process.start(NPI);
Process..addEventListener(NativeProcessExitEvent.EXIT, ReadFileList, false, 0, true);
}
private function ReadFileList(event:Event):void
{
var FS:FileStream = new FileStream();
var Buffer:File = File.applicationStorageDirectory.resolvePath("FilesBuffer.cmd");
FS.open(Buffer, FileMode.Read);
var FileData:String = FS.readUTFBytes(FS.bytesAvailable);
FS.close();
var FileArray:Array = FileData.split("/r/n");
var TempArray:ArrayCollection = new ArrayColletion();
var TempFile:File;
for(var i:int = 0;i<FileArray.length;i++){
TempFile = new File(FileArray[i]);
TempArray.addItem(TempFile);
}
}
Al final obtuvimos un Array (TempArray) que podríamos usar en una cuadrícula de datos (por ejemplo) con columnas como: "extensión, nombre de archivo, FilePath, etc."
Los archivos se actualizan cada 5 segundos.
Y, ¿por qué usamos todo ese código en lugar de un simple "File.getDirectoryListing ()"? Debido a que estamos actualizando nuestra aplicación cada 5 segundos, si usa getDirectoryListing (), nuestra aplicación requerirá mucha más RAM y, además, el comando cmd es mucho más rápido ... :)
Si tiene una idea mejor, por favor, compártala con nosotros. ¡Gracias! :RE
1 solución excelente para Windows: use Visual Studio, cree la aplicación .net que se encuentra aquí http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx En Adobe AIR use el proceso nativo para escuchar cambiar eventos enviados por .net