У меня есть приложение (Android и IOS), содержащее XML-файл (встроенный в Adobe Flash в настройках).
Любая идея, как сделать эти манипуляции с кодом AS3?
Найдите точный URL-адрес XML-файла.
Переместите XML-файл в определенную папку.
Вот что я пробовал:
1) Я пытался загрузить файл через URLLoader, а затем сохранить его в определенной папке (безуспешно).
var myLoader:URLLoader = new URLLoader();
myLoader.load(new URLRequest("soleil.xml"));
myLoader.addEventListener(Event.COMPLETE, complete_handler);
function complete_handler (event:Event) :void
{
var myXML:XML;
myXML = new XML(event.target.data);
var fr:FileReference = new FileReference();
fr.save(myXML, 'soleil.xml');
var fileStream:FileStream = new FileStream();
trace(File.applicationDirectory.nativePath);
fileStream.open(new File(File.applicationDirectory.nativePath+"\\soleil.xml"),FileMode.WRITE);
}
Последняя строка выдает ошибку Error #2004: One of the parameters is invalid:
fileStream.open(newFile(File.applicationDirectory.nativePath+"\\soleil.xml"),FileMode.WRITE);
2) Просто чтобы узнать, где хранится мой XML-файл для встраивания soleil.xml. Но я думаю, это только создает путь...
var file:File = File.applicationStorageDirectory;
file = file.resolvePath("soleil.xml");
trace(file.url);
Обновлено еще раз:
Файл XML содержит данные, которые я хочу использовать.
Что я делал до использования File:
var myXML:XML;
var myLoader:URLLoader = new URLLoader();
myLoader.load(new URLRequest("soleil.xml"));
myLoader.addEventListener(Event.COMPLETE, processSoleil);
function processSoleil(e:Event):void {
myXML = new XML(e.target.data);
var results:XMLList = myXML.row.(date == mySavedData.data.theDate);
if (results.length()){
for each(var row:XML in results){
//doingstuff
}
}
}
Должен ли я изменить свой метод?
Теперь, когда мне удалось скопировать soleil.xml по определенному пути, выполнив:
var packagedFile:File = File.applicationDirectory.resolvePath( "soleil.xml" );
var destFile_soleilXML:File = File.documentsDirectory.resolvePath( "soleil.xml" );
packagedFile.copyTo( destFile_soleilXML );
Хотя я мог бы загрузить файл, выполнив:
myLoader.load(new URLRequest(destFile_soleilXML.nativePath));
Разве я не должен это делать?
На данный момент у меня возникла ошибка при попытке загрузить мой xml-файл (ошибка потока (очевидно, это означает, что «файл не найден»)).
Какие-нибудь советы ?
Это для отслеживания URL-адреса ApplicationDirectory, чтобы найти, где может быть мой файл soleil.xml.
Что выводит код трассировки из моего первого комментария? Кроме того, .open должен иметь файловый режим .READ или .APPEND, не используйте FileMode.WRITE во время fileStream.open... В настоящее время я не могу ничего тестировать Android, просто пытаюсь получить представление о вашей проблеме, не тестируя ваш код. ..
PS: также сбивает с толку то, как FileReference позволяет вам использовать applicationDirectory для сохранения файла (у вас есть всплывающее окно «сохранить файл»? верно). Вероятно, он должен был поместить его в File.documentsDirectory или File.userDirectory, но я не знаю, что вы видите на своем экране (например:, какие пути к папкам в проводнике).
На Android файлы вашего приложения упакованы в APK и доступны непосредственно оттуда. Поскольку эти файлы обычно сжаты, прямого пути (nativePath) к этим файлам нет. Вам нужно будет использовать класс File для чтения/извлечения/копирования данных.
Файлы, упакованные с вашим приложением, хранятся относительно File.applicationDirectory:
var packagedFile:File = File.applicationDirectory.resolvePath( "soleil.xml" );
Чтобы скопировать это в место, где вы можете получить собственный путь. Лучшее и наиболее последовательное место — это File.applicationStorageDirectory:
var destFile:File = File.applicationStorageDirectory.resolvePath( "soleil.xml" );
packagedFile.copyTo( destFile );
Теперь вы должны иметь доступ к собственному пути скопированного файла:
trace( destFile.nativePath );
СПАСИБО БОЛЬШОЕ за такой точный ответ. К сожалению, теперь я пытаюсь загрузить этот xml, но выдает ошибку... Вот что я сделал: var myLoader:URLLoader = new URLLoader(); myLoader.load(new URLRequest(destFile.nativePath));, но у меня есть эта ошибка: Error #2044: Unhandled ioError:. text=Error #2032: Stream Error. URL: app:/storage/emulated/0/soleil.xml. Любая идея, почему?
@cocoGeek Я не понимаю, что вы пытаетесь сделать с помощью URLLoader; у вас уже есть доступ к объекту File. Чего вы пытаетесь достичь, загружая вместо этого URLLoader?
@cocoGeek Stream Error означает "Файл не найден". Проверьте, действительно ли файл существует по указанному URL.
Возможно, покажите код, который вы используете сейчас, ссылка на URL-адрес app:/ выглядит неправильно, если вы используете собственный путь, вам нужно будет добавить file://, чтобы загрузить его через загрузчик URL-адресов, я полагаю.
Я отредактировал свой пост, чтобы дать вам больше деталей. Еще раз спасибо за вашу помощь !
@ Брайан, я изменил свой пост
@Майкл, я тестировал на мобильном устройстве... может поэтому у меня app:/ вместо file://?
Почему вы использовали File.documentsDirectory? Этот каталог требует запроса разрешения на запись в общедоступную область хранения, и его действительно не следует использовать, если вы не знаете, что делаете. Копия, вероятно, не удалась, поскольку вы не запросили разрешение на чтение/запись для этой области. Попробуйте applicationStorageDirectory, как я предложил.
Та же ошибка: Error #2032: Unhandled ioError:. text=Error #2032: Stream Error. URL: app:/data/user/0/air.nc.cocogeek.mareeNC/nc.cocogeek.mareeNC/Local%20Store/soleil.xml
Все еще не выглядит правильно. У вас не должно быть схемы app://. Используете ли вы схему file:// в своем запросе? т.е. new URLRequest( "file://"+destFile.nativePath);
Разве Android не использует косую черту, например
+"//soleil.xml"? Нужны ли они здесь? В любом случае, что такое след дляtrace("Native Path : " + File.applicationDirectory.nativePath );?