2010-03-08 3 views
7

J'utilise Flex dans Flash Player 10 sous Windows, en utilisant FileReference pour charger un fichier en mémoire, comme ci-dessous.FileReference: Chargement d'un fichier verrouillé Windows

Mon problème est que lorsqu'un fichier est verrouillé par Windows, mon FileReference ne me donne pas des commentaires que le fichier est inaccessible - il envoie tout simplement jamais tout événement après mon appel load().

Quelqu'un a-t-il un aperçu de la façon de dire que Flash Player est incapable d'ouvrir le fichier?

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

J'espère que vous aurez une réponse. Je suis curieux à propos de celui-ci moi-même. – Robusto

Répondre

2

Une solution possible (sale) peut-être attendre de -LET 10 secondes, et supposons que le fichier n'est pas disponible si aucun événement a déclenché alors.

L'utilisation d'un setTimeout (et la compensation avec clearTimeout dans vos COMPLETE et *_ERROR gestionnaires d'événements) pourrait faire l'affaire.

Je serais heureux si quelqu'un pouvait trouver une meilleure solution, cependant.


EDIT: Bien sûr, vous voudrez peut-être écouter événement HTTP_STATUS (en attente d'une réponse 202 - si je comprends bien this documentation) plutôt que d'attendre COMPLETE ou *_ERROR.

+0

Cela aurait été plus simple si vous pouviez accéder à l'API win32, en utilisant l'API CreateFile pour ouvrir le fichier en lecture et vérifier s'il renvoie un gestionnaire valide ou non. Mais sans cela ... votre solution de contournement semble la seule solution. – user97863

+0

C'est ainsi que j'ai fini par le manipuler - étendant 'FileReference' avec une instance interne de' Timer' qui est démarrée sur load, arrêtée sur "completion" (complete ou error) et remise à l'état initial. Si le délai est écoulé, le chargement est annulé et un événement de dépassement de délai est envoyé. –

+0

(Je n'ai pas utilisé l'événement HTTP_STATUS car je ne m'intéresse qu'aux fichiers de la machine locale, aucun événement HTTP ne semble déclenché dans ce cas.) –

Questions connexes