Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.03.2013, 00:40
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 1  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию 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);
}
__________________
In Code We Trust

Старый 21.03.2013, 03:29
K.A.T.A.F.A.L.K.E.R вне форума Посмотреть профиль Отправить личное сообщение для K.A.T.A.F.A.L.K.E.R Найти все сообщения от K.A.T.A.F.A.L.K.E.R
  № 2  
Ответить с цитированием
K.A.T.A.F.A.L.K.E.R
 
Аватар для K.A.T.A.F.A.L.K.E.R

Регистрация: Jul 2005
Адрес: Go, Ukraine!
Сообщений: 787
Отправить сообщение для K.A.T.A.F.A.L.K.E.R с помощью ICQ
Может GC успешно сносит файлстримы до того как они записались (асинхронно пишутся ведь). Думаю если заменить openAsync на open проблема должна уйти. Ну или файлстриму ивент листенеров навешать и смотреть что да как он делает.
Я лично делал запись в файл не на комплите, а в прогрессе аппендом в файл. В прогрессе есть смысл заполнять буфер (скажем, 1 мб) и при заполнении писать его в файл. То же самое и в комплите, если вдруг какие байты остались. И еще желательно писать сначала во временный файл, и только когда все ок перемещать его в нужное место.
__________________
...я люблю людей!..

Старый 21.03.2013, 10:13
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 3  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Цитата:
Думаю если заменить openAsync на open проблема должна уйти.
А, ну пробовал, конечно, и синхронно - проблема остается.

Запись в прогрессе тоже пробовал - постоянно выдает ошибку 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, время: 03:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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