2017-09-08 8 views
0

In meiner App muss ich einige externe SWF-Dateien laden. Ich benutzte folgenden Code:laden beschädigte SWF-Datei zeigte keinen Fehler

var file:File; 
file = File.documentsDirectory.resolvePath("myfolder/myfile.swf"); 
if(file.exists) 
{ 
    var inFileStream:FileStream = new FileStream(); 
    inFileStream.open(file, FileMode.READ); 
    var swfBytes:ByteArray = new ByteArray(); 
    inFileStream.readBytes(swfBytes); 
    inFileStream.close(); 

    var loaderContext:LoaderContext = new LoaderContext(false, new ApplicationDomain(null)); 
    loaderContext.allowLoadBytesCodeExecution = true; 
    loaderContext.allowCodeImport = true; 
    myLoader = new Loader(); 
    try 
    { 
     myLoader.loadBytes(swfBytes, loaderContext); 
    } 
    catch(e:Error) 
    { 
     trace("Can't read file."); 
    } 
    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadComplete_swf); 
    myLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loop, false, 0, true); 
    myLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,loadingError); 
} 
else 
{ 
    trace("File doesn't exists."); 
} 

Alles funktioniert gut. Aber ich habe kürzlich herausgefunden, dass einige meiner SWF-Dateien beschädigt sind. Wenn diese Dateien geladen werden, wird kein vollständiges Ereignis ausgelöst, und es wird auch kein Fehler ausgegeben. Also, meine Frage ist, gibt es eine Möglichkeit zu finden, ob SWF-Datei beschädigt ist oder nicht? Ja, ich kann diese beschädigten SWF-Dateien ersetzen. Dies ist nur eine Vorsichtsmaßnahme, wenn dieses Problem erneut auftritt. Im Moment kann ich nur daran denken, einen Timer zu erstellen und zu überprüfen, ob das komplette Ereignis versandt wird oder nicht. Wenn nicht, dann kann Dateinachricht nicht gelesen werden. Gibt es einen besseren Weg, damit umzugehen?

+0

Um die Integrität der Datei zu testen, hash es und vergleichen Sie das Ergebnis mit Ihrem erwarteten Wert. blutige Krypto-Bibliothek wird empfohlen. – seventeen

+0

Die Dokumentation gibt für einen solchen Fall das Ereignis IO_ERROR an. – Organis

+0

@Organiss, IO_ERROR hat nicht ausgelöst. Es wird nur ausgelöst, wenn die Datei der Größe Null ist. – TheGunners

Antwort

1

Wenn eine Datei beschädigt ist, können alle möglichen unerwarteten Dinge passieren. Das Festlegen eines Zeitlimits ist eine gute Methode, um Probleme beim Laden von Ereignissen zu vermeiden. Wie von @seventeen vorgeschlagen, können Sie die Crypto-Bibliothek verwenden, um den Datei-Hash zu verifizieren, aber dies erfordert, dass Sie bereits einen Hash haben, mit dem verglichen werden kann, und dass das Ereignis "load complete" ausgelöst wird.

+0

Ich habe keinen Hash zu vergleichen. Die Gesamtzahl der Dateien ist mir unbekannt, daher ist das Speichern von Hash auch ein Problem. – TheGunners

+0

Dann ist eine sinnvolle Zeitüberschreitung sinnvoll. Da Sie die Größe von Dateien nicht kennen, sollte die Zeitüberschreitung nicht nur durch den Ladevorgang, sondern auch durch den Ladevorgang zurückgesetzt werden. –

Verwandte Themen