2010-03-08 12 views
7

Estoy usando Flex en Flash Player 10 en Windows, usando FileReference para cargar un archivo en la memoria, como se muestra a continuación.FileReference: cargando un archivo bloqueado en Windows

Mi problema es que cuando un archivo está bloqueado por Windows, mi FileReference no me da ningún comentario de que el archivo es inaccesible, simplemente nunca despacha ningún evento después de mi llamada load().

¿Alguien tiene idea de cómo saber si Flash Player no puede abrir el archivo?

var fileReference:FileReference = new FileReference(); 

private function onClick():void { 
    fileReference = new FileReference(); 
    fileReference.addEventListener(Event.SELECT, onSelect); 
    fileReference.addEventListener(Event.COMPLETE, onComplete); 

    fileReference.addEventListener(Event.CANCEL, onOther); 
    fileReference.addEventListener(IOErrorEvent.IO_ERROR, onOther); 
    fileReference.addEventListener(ProgressEvent.PROGRESS, onOther); 
    fileReference.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onOther); 
    // I've tried adding all of the other declared events 
    // for FileReference here as well 

    fileReference.browse(); 
} 

private function onSelect(event:Event):void { 
    trace(fileReference.name); 

    try { 
     fileReference.load(); 
    } catch (e:Error) { 
     trace(e); 
    } 
} 

private function onComplete(event:Event):void { 
    trace(fileReference.data.length); 
} 

private function onOther(event:Event):void { 
    trace("other:" + event.toString()); 
} 
+0

Espero que recibas una respuesta. Tengo curiosidad sobre este yo mismo. – Robusto

Respuesta

2

Una posible (sucio) solución alternativa podría ser la de esperar a decir- -Let 10 segundos, y supongamos que el archivo no está disponible si ningún caso ha dado lugar a continuación.

El uso de un setTimeout (y despejar con clearTimeout en sus COMPLETE y *_ERROR eventos manipuladores) puede hacer el truco.

Estaría encantado si alguien pudiera encontrar una mejor solución.


EDIT: Por supuesto, es posible que desee escuchar HTTP_STATUS evento (en espera de una respuesta 202 - si he entendido correctamente this documentation) en lugar de esperar a que COMPLETE o *_ERROR.

+0

Habría sido más fácil si pudiera acceder a la API Win32, utilizando CreateFile API para abrir el archivo para el acceso de lectura y comprobar si devuelve un controlador válido o no. Pero sin eso ... su solución parece el único camino a seguir. – user97863

+0

Esta es la forma en que terminé manejándolo, extendiendo 'FileReference' con una instancia interna' Timer' que se inicia en la carga, se detiene en "finalización" (completa o error) y se restablece en el progreso. Si el temporizador se agota, la carga se cancela y se envía un evento de tiempo de espera excedido. –

+0

(No usé el evento HTTP_STATUS porque solo estoy interesado en los archivos de la máquina local, no parece que se activen eventos HTTP en ese caso). –

Cuestiones relacionadas