AS3 SharedObject读/写文件位置更改

时间:2018-12-07 15:23:49

标签: actionscript-3 flash animate-cc

我正在使用以下AS3代码,将两个阵列中的数据写入和读取到本地文件中,分别使用Windows 10上的Animate CC 2019和用于桌面/ Flash(.swf)发布的AIR 30.0。我使用两个输入文本框,input1和input2,将新数据添加到数组中。

当我测试FLA时,创建的数据文件具有.sol扩展名,并放置在文件夹路径中:

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

如果我使用.air安装程序包发布和安装程序,则该程序的已安装版本也会访问相同文件夹路径中的完全相同的文件。如果我将其安装在运行Windows 7的另一台计算机上,则使用相同的位置,因此文件位置看起来非常一致。

问题: 如何在Windows上强制将代码保存到本地硬盘上的其他位置?例如,在documents文件夹中还是要在系统驱动器上创建一个新文件夹并将文件保存在那里?或者,甚至更好的提示用户选择文件夹并自己归档?

如果可以的话,请考虑我正在使用 SharedObject 寻找答案,而不是URLLoader,File,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 :(得分:2)

我不知道更改共享对象存储位置的方法。该机制旨在从开发人员中抽象出来。

由于使用的是AIR,因此实际上您可以忘记共享对象,而只需在您的应用程序允许的地方写入自己的文件。您可以使用与共享对象相同的格式来执行此操作,并且不必担心文件数据的排列(保存对象,读回对象-就像共享对象一样),唯一的区别是您将文件加载/保存到您选择的位置。

这里是一个例子:

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

如果要保存复杂的对象(不是原始对象的对象),则需要先注册该类。共享对象也是如此。例如See this answer