2010-03-08 16 views
7

Tôi đang sử dụng Flex trong Flash Player 10 trên Windows, sử dụng FileReference để tải tệp vào bộ nhớ, như bên dưới.FileReference: Tải tập tin bị khóa Windows

Vấn đề của tôi là khi tệp bị khóa bởi Windows, FileReference của tôi không cho tôi bất kỳ phản hồi nào rằng tệp không thể truy cập được - đơn giản là không bao giờ gửi bất kỳ sự kiện nào sau khi gọi số load().

Có ai có thông tin chi tiết về cách nói rằng Flash Player không thể mở tệp không?

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

Tôi hy vọng bạn nhận được câu trả lời. Tôi tò mò về bản thân mình. – Robusto

Trả lời

2

Cách giải quyết có thể (dơ bẩn) có thể phải chờ khoảng 10 giây và giả sử tệp không khả dụng nếu không có sự kiện nào được kích hoạt.

Sử dụng setTimeout (và xóa số này bằng clearTimeout trong trình xử lý sự kiện COMPLETE*_ERROR sự kiện) có thể thực hiện thủ thuật.

Tôi sẽ rất vui nếu có ai đó có thể đưa ra giải pháp đẹp hơn.


EDIT: Tất nhiên bạn có thể muốn nghe HTTP_STATUS sự kiện (chờ đợi một câu trả lời 202 - nếu tôi hiểu đúng this documentation) chứ không phải chờ đợi COMPLETE hoặc *_ERROR.

+0

Sẽ dễ dàng hơn nếu bạn có thể truy cập vào win32 api, sử dụng API CreateFile để mở tệp để truy cập đọc và kiểm tra thời tiết nó trả về trình xử lý hợp lệ hay không. Nhưng nếu không có ... workaround của bạn âm thanh là cách duy nhất để đi. – user97863

+0

Đây là cách tôi kết thúc xử lý nó - mở rộng 'FileReference' với một cá thể' Timer' bên trong được bắt đầu khi tải, dừng lại trên "hoàn thành" (hoàn thành hoặc lỗi), và thiết lập lại khi đang tiến hành. Nếu hết giờ, tải sẽ bị hủy và sự kiện hết giờ được gửi đi. –

+0

(Tôi không sử dụng sự kiện HTTP_STATUS vì tôi chỉ quan tâm đến các tệp từ máy cục bộ; không có sự kiện HTTP nào xuất hiện trong trường hợp đó). –