Как сохранить XML-файл в определенную папку?

У меня есть приложение (Android и IOS), содержащее XML-файл (встроенный в Adobe Flash в настройках).

Любая идея, как сделать эти манипуляции с кодом AS3?

  1. Найдите точный URL-адрес XML-файла.

  2. Переместите 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-файл (ошибка потока (очевидно, это означает, что «файл не найден»)).

Какие-нибудь советы ?

Разве Android не использует косую черту, например +"//soleil.xml"? Нужны ли они здесь? В любом случае, что такое след для trace("Native Path : " + File.applicationDirectory.nativePath );?

VC.One 18.07.2019 07:22

Это для отслеживания URL-адреса ApplicationDirectory, чтобы найти, где может быть мой файл soleil.xml.

cocoGeek 18.07.2019 07:26

Что выводит код трассировки из моего первого комментария? Кроме того, .open должен иметь файловый режим .READ или .APPEND, не используйте FileMode.WRITE во время fileStream.open... В настоящее время я не могу ничего тестировать Android, просто пытаюсь получить представление о вашей проблеме, не тестируя ваш код. ..

VC.One 18.07.2019 07:35

PS: также сбивает с толку то, как FileReference позволяет вам использовать applicationDirectory для сохранения файла (у вас есть всплывающее окно «сохранить файл»? верно). Вероятно, он должен был поместить его в File.documentsDirectory или File.userDirectory, но я не знаю, что вы видите на своем экране (например:, какие пути к папкам в проводнике).

VC.One 18.07.2019 07:50

См.: (1)Возможные места хранения, а также (2)Как сохранить мобильный файл в AIR.

VC.One 18.07.2019 07:53
1
5
248
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На 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 19.07.2019 08:28

@cocoGeek Я не понимаю, что вы пытаетесь сделать с помощью URLLoader; у вас уже есть доступ к объекту File. Чего вы пытаетесь достичь, загружая вместо этого URLLoader?

Brian 19.07.2019 20:30

@cocoGeek Stream Error означает "Файл не найден". Проверьте, действительно ли файл существует по указанному URL.

VC.One 19.07.2019 22:49

Возможно, покажите код, который вы используете сейчас, ссылка на URL-адрес app:/ выглядит неправильно, если вы используете собственный путь, вам нужно будет добавить file://, чтобы загрузить его через загрузчик URL-адресов, я полагаю.

Michael 20.07.2019 13:45

Я отредактировал свой пост, чтобы дать вам больше деталей. Еще раз спасибо за вашу помощь !

cocoGeek 20.07.2019 22:51

@ Брайан, я изменил свой пост

cocoGeek 21.07.2019 10:22

@Майкл, я тестировал на мобильном устройстве... может поэтому у меня app:/ вместо file://?

cocoGeek 21.07.2019 10:24

Почему вы использовали File.documentsDirectory? Этот каталог требует запроса разрешения на запись в общедоступную область хранения, и его действительно не следует использовать, если вы не знаете, что делаете. Копия, вероятно, не удалась, поскольку вы не запросили разрешение на чтение/запись для этой области. Попробуйте applicationStorageDirectory, как я предложил.

Michael 21.07.2019 11:07

Та же ошибка: Error #2032: Unhandled ioError:. text=Error #2032: Stream Error. URL: app:/data/user/0/air.nc.cocogeek.mareeNC/nc.cocogeek.mareeNC‌​/Local%20Store/solei‌​l.xml

cocoGeek 22.07.2019 02:28

Все еще не выглядит правильно. У вас не должно быть схемы app://. Используете ли вы схему file:// в своем запросе? т.е. new URLRequest( "file://"+destFile.nativePath);

Michael 23.07.2019 07:21

Другие вопросы по теме