|
|
|||||
FileStream не стабильно пишет файлы
Делаю загрузчик sprite sheets с сервера с помощью URLLoader и FileStream.
Почему-то иногда файлы сохраняются нулевого размера. Вроде ProgressEvent всегда показывает наличие байтов при загрузке с URLLoader, а на деле случаются нулевые файлы. Подскажите, плиз, как правильно делать такую загрузку множества файлов? files = 21;// мое количество sprite sheets filesArray = new Array(); for (var i:int = 0; i < files; i++) { filesArray.push(i+ 1+ '.png'); filesArray.push(i+ 1+ '.xml'); } nextDownload(); private function nextDownload():void { if (count < filesArray.length){ downloadFile("http://mysite.com/assets/symbols/" + appScaleFactor + 'x/' + filesArray[count], "assets/symbols/" + filesArray[count]); } else { trace('finished'); } } private function downloadFile(url:String, fileName:String):void { stream = new URLStream(); _fileName = fileName; var request:URLRequest = new URLRequest(url); stream.addEventListener(flash.events.Event.COMPLETE, completeHandler); stream.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); stream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); stream.addEventListener(ProgressEvent.PROGRESS, progressHandler); stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); try { stream.load(request); } catch (error:Error) { trace("Unable to load requested URL."); } } private function completeHandler(event:flash.events.Event):void { var fileData:ByteArray = new ByteArray(); stream.readBytes(fileData,0,stream.bytesAvailable); stream.removeEventListener(flash.events.Event.COMPLETE, completeHandler); stream.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); stream.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); stream.removeEventListener(ProgressEvent.PROGRESS, progressHandler); stream.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); stream =null; var newFile:File = File.applicationStorageDirectory.resolvePath(_fileName); var fs:FileStream = new FileStream(); fs.openAsync(newFile, FileMode.WRITE); fs.writeBytes(fileData,0,fileData.length); fs.close(); fs = null; count++; nextDownload(); } private function progressHandler(event:ProgressEvent):void { trace("progressHandler: " + event); } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function httpStatusHandler(event:HTTPStatusEvent):void { trace("httpStatusHandler: " + event); } private function ioErrorHandler(event:IOErrorEvent):void { trace("ioErrorHandler: " + event); }
__________________
In Code We Trust |
|
|||||
Может GC успешно сносит файлстримы до того как они записались (асинхронно пишутся ведь). Думаю если заменить openAsync на open проблема должна уйти. Ну или файлстриму ивент листенеров навешать и смотреть что да как он делает.
Я лично делал запись в файл не на комплите, а в прогрессе аппендом в файл. В прогрессе есть смысл заполнять буфер (скажем, 1 мб) и при заполнении писать его в файл. То же самое и в комплите, если вдруг какие байты остались. И еще желательно писать сначала во временный файл, и только когда все ок перемещать его в нужное место.
__________________
...я люблю людей!.. |
|
|||||
Цитата:
Запись в прогрессе тоже пробовал - постоянно выдает ошибку Error #3013: File or directory is in use. Хотя и удаляю при наличии файла. Что аппендом, что write, все одно. Добавлено через 1 час 2 минуты Нашел проблему - чисто моя специфичная проблема связанная с ресайзом сцены и двойным вызовом загрузки. Спасибо K.A.T.A.F.A.L.K.E.R
__________________
In Code We Trust |
Часовой пояс GMT +4, время: 14:51. |
|
« Предыдущая тема | Следующая тема » |
|
|