尝试检查并替换我的 AIR 应用程序中使用的 xml 文件
Trying to check & replace the xml file used in my AIR app
我有一个正在向用户显示信息的应用程序。这些信息位于 xml 文件中,直接嵌入到应用程序中。
每年,我都必须更新 xml 文件中的信息,因此,我必须通过 Google Play Store 和 Apple Store 提交新的应用程序更新。
我想到了一个方法,或许可以避免更新所有应用程序。
我在想应用程序在启动时是否正在检查 xml 文件的文件大小以及我在服务器上拥有的 xml 文件的文件大小。
如果大小相同,则文件不会是 download/replace。
如果大小不同,文件将被下载并替换当前的 xml 文件。
问题:
- 即使我的应用程序当前正在使用并显示 xml 信息,它是否可以替换文件(也许 AIR 不允许它,因为它正在被应用程序读取)?
我试过了,但没用:
function checking_Files():void
{
var size_of_horaires_local;
var size_of_horaires_online;
var url_local:URLRequest = new URLRequest("horaires3.xml");
var url_online:URLRequest = new URLRequest("http://****.vps.ovh.ca/horaires3.xml");
;
// Define the URLLoader.
var loader_local:URLLoader = new URLLoader();
var loader_online:URLLoader = new URLLoader();
loader_local.load(url_local);
loader_online.load(url_online);
// Listen for when the file has finished loadingloader_local_Complete
loader_local.addEventListener(Event.COMPLETE, loader_local_Complete);
loader_online.addEventListener(Event.COMPLETE, loader_online_Complete);
function loader_local_Complete(e:Event):void
{
// The output of the text file is available via the data property
// of URLLoader.
trace("size: " + (URLLoader(e.target).bytesTotal));
size_of_horaires_local = URLLoader(e.target).bytesTotal;
}
function loader_online_Complete(e:Event):void{
// The output of the text file is available via the data property
// of URLLoader.
trace("size: " + (URLLoader(e.target).bytesTotal));
size_of_horaires_online = URLLoader(e.target).bytesTotal;
check_if_size_different();
}
function check_if_size_different():void{
trace("checking if size is different");
if(size_of_horaires_local == size_of_horaires_online){
trace("do nothing");
log_txt.text="Do nothing, same size. Copy File to specific path";
dontWait = true;
//do nothing
}else{
log_txt.text="download the new xml file";
download_the_new_xml();
wait = true;
log_txt.text="Récupération de données en cours...";
}
}
function download_the_new_xml():void{
var urlString:String = "http://****.vps.ovh.ca/horaires3.xml";
var urlReq:URLRequest = new URLRequest(urlString);
var urlStream:URLStream = new URLStream();
var fileData:ByteArray = new ByteArray();
urlStream.addEventListener(Event.COMPLETE, loaded);
urlStream.load(urlReq);
function loaded(event:Event):void {
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
writeFile();
}
function writeFile():void {
fileStream.open(file, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length);
fileStream.close();
wait = false;
dontWait = true;
introFinish(null);
//log_txt.text="The new XML file is written here : "+file.url;
trace("The new XML file is written here : "+file.url);
}
}
新xml文件的“路径”似乎有误。我找不到编写和替换应用程序中嵌入的旧 xml 的方法。
有什么想法可行吗?
我认为您无法覆盖捆绑到您的应用中的文件。
一个可能的解决方案是将 XML 写入一个新的本地 XML 文件并将其保存在 documentsDirectory 或 appStorageDirectory 中并包含一个版本号作为节点。
public static var _xmlFile:File = File.documentsDirectory.resolvePath("yourapp.xml");
private static const _initialXML:String = "<?xml version='1.0' encoding='UTF-8'?><contents><version>100</version></contents>";
//only write to local on first launch
if(!_xmlFile.exists){
_writeFileStream.open(_xmlFile, FileMode.WRITE);
_writeFileStream.writeUTFBytes(_initialXML);
_writeFileStream.close();
}
然后,每当应用程序启动时,它都会加载本地 xml 以及来自服务器的新 xml,比较版本号并在必要时用服务器版本覆盖本地版本。
应用随后使用本地版本进行配置。
我有一个正在向用户显示信息的应用程序。这些信息位于 xml 文件中,直接嵌入到应用程序中。 每年,我都必须更新 xml 文件中的信息,因此,我必须通过 Google Play Store 和 Apple Store 提交新的应用程序更新。
我想到了一个方法,或许可以避免更新所有应用程序。
我在想应用程序在启动时是否正在检查 xml 文件的文件大小以及我在服务器上拥有的 xml 文件的文件大小。 如果大小相同,则文件不会是 download/replace。 如果大小不同,文件将被下载并替换当前的 xml 文件。
问题:
- 即使我的应用程序当前正在使用并显示 xml 信息,它是否可以替换文件(也许 AIR 不允许它,因为它正在被应用程序读取)?
我试过了,但没用:
function checking_Files():void
{
var size_of_horaires_local;
var size_of_horaires_online;
var url_local:URLRequest = new URLRequest("horaires3.xml");
var url_online:URLRequest = new URLRequest("http://****.vps.ovh.ca/horaires3.xml");
;
// Define the URLLoader.
var loader_local:URLLoader = new URLLoader();
var loader_online:URLLoader = new URLLoader();
loader_local.load(url_local);
loader_online.load(url_online);
// Listen for when the file has finished loadingloader_local_Complete
loader_local.addEventListener(Event.COMPLETE, loader_local_Complete);
loader_online.addEventListener(Event.COMPLETE, loader_online_Complete);
function loader_local_Complete(e:Event):void
{
// The output of the text file is available via the data property
// of URLLoader.
trace("size: " + (URLLoader(e.target).bytesTotal));
size_of_horaires_local = URLLoader(e.target).bytesTotal;
}
function loader_online_Complete(e:Event):void{
// The output of the text file is available via the data property
// of URLLoader.
trace("size: " + (URLLoader(e.target).bytesTotal));
size_of_horaires_online = URLLoader(e.target).bytesTotal;
check_if_size_different();
}
function check_if_size_different():void{
trace("checking if size is different");
if(size_of_horaires_local == size_of_horaires_online){
trace("do nothing");
log_txt.text="Do nothing, same size. Copy File to specific path";
dontWait = true;
//do nothing
}else{
log_txt.text="download the new xml file";
download_the_new_xml();
wait = true;
log_txt.text="Récupération de données en cours...";
}
}
function download_the_new_xml():void{
var urlString:String = "http://****.vps.ovh.ca/horaires3.xml";
var urlReq:URLRequest = new URLRequest(urlString);
var urlStream:URLStream = new URLStream();
var fileData:ByteArray = new ByteArray();
urlStream.addEventListener(Event.COMPLETE, loaded);
urlStream.load(urlReq);
function loaded(event:Event):void {
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
writeFile();
}
function writeFile():void {
fileStream.open(file, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length);
fileStream.close();
wait = false;
dontWait = true;
introFinish(null);
//log_txt.text="The new XML file is written here : "+file.url;
trace("The new XML file is written here : "+file.url);
}
}
新xml文件的“路径”似乎有误。我找不到编写和替换应用程序中嵌入的旧 xml 的方法。
有什么想法可行吗?
我认为您无法覆盖捆绑到您的应用中的文件。
一个可能的解决方案是将 XML 写入一个新的本地 XML 文件并将其保存在 documentsDirectory 或 appStorageDirectory 中并包含一个版本号作为节点。
public static var _xmlFile:File = File.documentsDirectory.resolvePath("yourapp.xml");
private static const _initialXML:String = "<?xml version='1.0' encoding='UTF-8'?><contents><version>100</version></contents>";
//only write to local on first launch
if(!_xmlFile.exists){
_writeFileStream.open(_xmlFile, FileMode.WRITE);
_writeFileStream.writeUTFBytes(_initialXML);
_writeFileStream.close();
}
然后,每当应用程序启动时,它都会加载本地 xml 以及来自服务器的新 xml,比较版本号并在必要时用服务器版本覆盖本地版本。
应用随后使用本地版本进行配置。