Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   FileStream не стабильно пишет файлы (http://www.flasher.ru/forum/showthread.php?t=196206)

Astraport 21.03.2013 00:40

FileStream не стабильно пишет файлы
 
Делаю загрузчик sprite sheets с сервера с помощью URLLoader и FileStream.
Почему-то иногда файлы сохраняются нулевого размера. Вроде ProgressEvent всегда показывает наличие байтов при загрузке с URLLoader, а на деле случаются нулевые файлы.
Подскажите, плиз, как правильно делать такую загрузку множества файлов?

Код AS3:

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);
}


K.A.T.A.F.A.L.K.E.R 21.03.2013 03:29

Может GC успешно сносит файлстримы до того как они записались (асинхронно пишутся ведь). Думаю если заменить openAsync на open проблема должна уйти. Ну или файлстриму ивент листенеров навешать и смотреть что да как он делает.
Я лично делал запись в файл не на комплите, а в прогрессе аппендом в файл. В прогрессе есть смысл заполнять буфер (скажем, 1 мб) и при заполнении писать его в файл. То же самое и в комплите, если вдруг какие байты остались. И еще желательно писать сначала во временный файл, и только когда все ок перемещать его в нужное место.

Astraport 21.03.2013 10:13

Цитата:

Думаю если заменить openAsync на open проблема должна уйти.
А, ну пробовал, конечно, и синхронно - проблема остается.

Запись в прогрессе тоже пробовал - постоянно выдает ошибку Error #3013: File or directory is in use.
Хотя и удаляю при наличии файла. Что аппендом, что write, все одно.

Добавлено через 1 час 2 минуты
Нашел проблему - чисто моя специфичная проблема связанная с ресайзом сцены и двойным вызовом загрузки.
Спасибо K.A.T.A.F.A.L.K.E.R


Часовой пояс GMT +4, время: 04:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.