AS3 SharedObject изменение расположения файла чтения / записи - PullRequest
0 голосов
/ 07 декабря 2018

Я использую следующий код AS3 для записи и чтения данных из двух массивов в локальный файл, используя Animate CC 2019 в Windows 10 и параметры публикации AIR 30.0 для Desktop / Flash (.swf).Я использую два текстовых поля ввода, input1 и input2, чтобы добавить новые данные в массивы.

Когда я тестирую FLA, созданный файл данных имеет расширение .sol и помещается в путь к папке:

C: \ Users \ username \ AppData \ Roaming \ FLA filename \ Local Store # SharedObjects \ FLA filename.swf \

Если я опубликую и установлю программу с помощью установочного пакета .air, точныйк тому же файлу, находящемуся в том же пути к папке, также имеет доступ установленная версия программы.То же расположение используется, если я устанавливаю на другой компьютер под управлением Windows 7, поэтому расположение файла выглядит довольно согласованным.

Вопрос: Как заставить код сохранить в другом месте налокальный жесткий диск на винде?Например, в папке документов или создать новую папку на системном диске и сохранить там файл?Или, что еще лучше, предложить пользователю самому выбрать папку и файл?

Пожалуйста, подумайте, я ищу ответ, используя, если возможно, SharedObject , а не альтернативные методы, такие как URLLoader,Файл, FileStream, FileMode.Причина в том, что я могу хранить несколько массивов содержимого в файле, не имея дело с расположением данных в файле.Итак, я могу легко прочитать данные для каждого массива, как показано ниже.

Заранее спасибо

Этот код я использую для доступа к локальному файлу:

var datavariable:SharedObject = SharedObject.getLocal("filiename");
var data1:Array = new Array ();
var data2:Array = new Array ();

btn_read.addEventListener(MouseEvent.CLICK, readfromfile);
btn_write.addEventListener(MouseEvent.CLICK, writetofile);
btn_new.addEventListener(MouseEvent.CLICK, newentry);

//To add new data from input text boxes to the arrays:
function newentry(e:Event):void
{
    data1.push(input1.text);
    data2.push(input2.text);
}

//To write to the local file:
function readfromfile(e:Event):void
{
    data1 = datavariable.data.d1
    data2 = datavariable.data.d2    
}

//To read from the local file:
function writetofile(e:Event):void
{
    datavariable.data.d1 = data1
    datavariable.data.d2 = data2
    datavariable.flush();
}

1 Ответ

0 голосов
/ 07 декабря 2018

Я не знаю, как изменить место хранения общего объекта.Этот механизм предназначен для абстрагирования от разработчика.

Поскольку вы используете AIR, вы можете на самом деле забыть об общих объектах и ​​просто писать свои собственные файлы везде, где у вашего приложения есть на это разрешение.Вы можете сделать это, используя тот же формат, что и совместно используемый объект, и не нужно беспокоиться о расположении данных в файле (вы сохраняете объект, вы читаете объект обратно - так же, как это делает Shared Object), единственныйРазница в том, что вы загружаете / сохраняете файл в том месте, где вы выбрали.

Вот пример:

function writetofile(e:Event):void
{
    //create an object that holds your data, this will act the same as the 'data' value of a shared object
    var saveObject = {
        d1: data1,
        d2: data2
    }

    //using the File and FileStream classes to read/save files
    var file:File = File.applicationStorageDirectory.resolvePath("saveData.data"); //or where and whatever you want to store and call the save file
        var fileStream:FileStream = new FileStream();
        fileStream.open(file, FileMode.WRITE);
        fileStream.writeObject(saveObject); //write the object to this file
        fileStream.close(); //close the File Stream
}

function readfromfile(e:Event):void
{
    var file:File = File.applicationStorageDirectory.resolvePath("saveData.data");

    var fileStream:FileStream = new FileStream();
        fileStream.open(file, FileMode.READ);

    var savedObject = fileStream.readObject();
    fileStream.close();

    data1 = savedObject.d1;
    data2 = savedObject.d2;    
}

Если вы хотите сохранить сложные объекты (объекты, которые не являются примитивами), вам нужнозарегистрировать класс первым.Это касается и общих объектов. См. Этот ответ для примера.

...