2010-03-08 53 views
7

我在Windows上使用Flex Flash Player 10,使用FileReference将文件加载到内存中,如下所示。FileReference:加载Windows锁定的文件

我的问题是,当一个文件被Windows锁定时,我的FileReference没有给我任何关于该文件无法访问的反馈 - 在我致电load()后,根本不会发送任何事件。

有没有人知道如何判断Flash Player无法打开文件?

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

我希望你能得到答案。我对自己很好奇。 – Robusto 2010-03-08 20:37:52

回答

2

可能的(肮脏)的解决方法可能是等待 - 让声言如下─10秒,并假设如果没有事件触发,则文件不可用。

使用setTimeout(并在你的COMPLETE*_ERROR事件处理程序clearTimeout清除它)可能做的伎俩。

不过,如果有人能想出更好的解决方案,我会很高兴。


编辑:当然,你可能要听HTTP_STATUS事件(如等待一个答案202 - 如果我理解正确的this documentation),而不是等待COMPLETE*_ERROR

+0

如果您可以访问win32 api,使用CreateFile API打开文件进行读取访问并检查是否返回有效的处理程序,会更容易。 但是没有这个......你的解决方法听起来是唯一的方法。 – user97863 2010-03-17 06:55:17

+0

这是我最终处理它的方式 - 使用内部的'Timer'实例在加载时启动'FileReference',在“完成”(完成或错误)时停止,并重置进度。如果定时器耗尽,负载将被取消并发送超时事件。 – 2010-03-22 17:31:46

+0

(我没有使用HTTP_STATUS事件,因为我只对来自本地机器的文件感兴趣;在这种情况下没有HTTP事件被激发。) – 2010-03-22 17:33:19