如何编写已在 as3 中使用 URLLoader 打开的 XML 文件?
How to write a XML file which is already opened using URLLoader in as3?
我在应用程序目录中有一个 XML 我需要修改 XML file.First 我使用以下代码使用 URLLoder 加载 XML 然后修改 XML 并且当我尝试在同一位置用相同的名称写入 XML 文件时它不是 working.If 我将文件名更改为其他名称然后它正在工作 fine.So 我的问题是我想修改 XML 文件并将其保存在相同的位置 name.How 我可以实现吗?
private var ldr:URLLoader;
private function changeAppID():void
{
var FolderPath = File.applicationDirectory.nativePath+"\assets"
var tempFile:File = File.userDirectory.resolvePath(FolderPath);
if(tempFile.exists)
{
ldr = new URLLoader();
ldr.addEventListener(Event.COMPLETE, onLoad);
ldr.load(new URLRequest(FolderPath + "\data\application.xml"));
}
else
{
trace("Assets Folder Does Not Exists !");
}
}
protected function onLoad(event:Event):void
{
var bytearray:ByteArray = new ByteArray();
var loadedXml:XML = new XML((event.target).data);
loadedXml.children()[0] = "Riaxe"+getCurrentTime();
bytearray = getXMLToByteArray( loadedXml );
var path:String = File.applicationDirectory.nativePath + "\assets\data\application.xml";
var file:File = new File(path);
var fileStream:FileStream = new FileStream();
fileStream.open( file, FileMode.WRITE );
fileStream.writeBytes( bytearray , 0 , bytearray.length );
fileStream.close();
}
为避免该问题,您必须使用 FileStream.openAsync()
异步打开文件,因此您的代码可以像这样:
var fileStream:FileStream = new FileStream();
fileStream.openAsync(file, FileMode.WRITE);
// here you can write your XML content as string, you dont need a ByteArray object
fileStream.writeUTFBytes(loadedXml.toXMLString());
fileStream.close();
希望能帮到你。
为什么用 URLRequest
而不是 FileStream
打开文件?您可以使用 FileMode.UPDATE
来同步完成这两件事。
例如:
var assetsDir:File = File.applicationDirectory.resolvePath("assets");
var applicationFile:File = assetsDir.resolvePath("data/application.xml");
// open the file for read/write
var fileStream:FileStream = new FileStream();
fileStream.open(applicationFile, FileMode.UPDATE);
// load the XML and change it
var xml:XML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
xml.id = (Math.random() * int.MAX_VALUE).toString(36);
xml.date = new Date().toDateString();
// replace contents of file with modified XML
fileStream.position = 0;
fileStream.truncate();
fileStream.writeUTFBytes(xml.toXMLString());
fileStream.close();
注:
- 您正在检查
tempFile.exists
但没有对其进行任何操作。我不确定你想在那里做什么,所以我省略了它。
- 您可以使用
readUTFBytes()
和 writeUTFBytes()
. 将 XML 字符串直接读取和写入文件
- 使用
nativePath + "\assets"
之类的字符串文字构建本机文件路径 URL 不是一个好习惯,请改用 resolvePath
(see docs)。
- 我不太确定你想用
application.xml
做什么。看起来有点像您正在尝试 allow multiple instances of your app to be started,但据我所知 applicationDirectory/assets/data/application.xml
不是正确的路径,您可以在其中包含自己的 XML 文件。也许您正在制作 AIR 应用程序生成器实用程序?
问题是应用程序目录位于沙箱中,并且不应以任何方式修改其中的文件。这对任何技术都是适用的,即使有一些已知的 hacky work arounds。
解决方案是始终使用始终可用且专用于此目的的应用程序存储目录。如果您不使用该目录,那么您就是通过尝试在根据定义受保护且沙盒化以防止任何类型的修改的文件夹中工作来创建自己的问题的人。
如果您坚持这样做,那么您可能会像我说的那样找到一些变通办法,但您永远无法保证您的变通办法在每个 OS 或任何未来 OS 之后都能正常工作更新。
您的应用可能会在 OS 更新后或已经在具有更高安全设置的某些 OS 上中断,这只是因为您有根据地决定违反规则。
我再次建议使用应用程序存储目录,而不是为此目的专门设置的沙盒,这是在这种情况下唯一正确的答案。
我在应用程序目录中有一个 XML 我需要修改 XML file.First 我使用以下代码使用 URLLoder 加载 XML 然后修改 XML 并且当我尝试在同一位置用相同的名称写入 XML 文件时它不是 working.If 我将文件名更改为其他名称然后它正在工作 fine.So 我的问题是我想修改 XML 文件并将其保存在相同的位置 name.How 我可以实现吗?
private var ldr:URLLoader;
private function changeAppID():void
{
var FolderPath = File.applicationDirectory.nativePath+"\assets"
var tempFile:File = File.userDirectory.resolvePath(FolderPath);
if(tempFile.exists)
{
ldr = new URLLoader();
ldr.addEventListener(Event.COMPLETE, onLoad);
ldr.load(new URLRequest(FolderPath + "\data\application.xml"));
}
else
{
trace("Assets Folder Does Not Exists !");
}
}
protected function onLoad(event:Event):void
{
var bytearray:ByteArray = new ByteArray();
var loadedXml:XML = new XML((event.target).data);
loadedXml.children()[0] = "Riaxe"+getCurrentTime();
bytearray = getXMLToByteArray( loadedXml );
var path:String = File.applicationDirectory.nativePath + "\assets\data\application.xml";
var file:File = new File(path);
var fileStream:FileStream = new FileStream();
fileStream.open( file, FileMode.WRITE );
fileStream.writeBytes( bytearray , 0 , bytearray.length );
fileStream.close();
}
为避免该问题,您必须使用 FileStream.openAsync()
异步打开文件,因此您的代码可以像这样:
var fileStream:FileStream = new FileStream();
fileStream.openAsync(file, FileMode.WRITE);
// here you can write your XML content as string, you dont need a ByteArray object
fileStream.writeUTFBytes(loadedXml.toXMLString());
fileStream.close();
希望能帮到你。
为什么用 URLRequest
而不是 FileStream
打开文件?您可以使用 FileMode.UPDATE
来同步完成这两件事。
例如:
var assetsDir:File = File.applicationDirectory.resolvePath("assets");
var applicationFile:File = assetsDir.resolvePath("data/application.xml");
// open the file for read/write
var fileStream:FileStream = new FileStream();
fileStream.open(applicationFile, FileMode.UPDATE);
// load the XML and change it
var xml:XML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
xml.id = (Math.random() * int.MAX_VALUE).toString(36);
xml.date = new Date().toDateString();
// replace contents of file with modified XML
fileStream.position = 0;
fileStream.truncate();
fileStream.writeUTFBytes(xml.toXMLString());
fileStream.close();
注:
- 您正在检查
tempFile.exists
但没有对其进行任何操作。我不确定你想在那里做什么,所以我省略了它。 - 您可以使用
readUTFBytes()
和writeUTFBytes()
. 将 XML 字符串直接读取和写入文件
- 使用
nativePath + "\assets"
之类的字符串文字构建本机文件路径 URL 不是一个好习惯,请改用resolvePath
(see docs)。 - 我不太确定你想用
application.xml
做什么。看起来有点像您正在尝试 allow multiple instances of your app to be started,但据我所知applicationDirectory/assets/data/application.xml
不是正确的路径,您可以在其中包含自己的 XML 文件。也许您正在制作 AIR 应用程序生成器实用程序?
问题是应用程序目录位于沙箱中,并且不应以任何方式修改其中的文件。这对任何技术都是适用的,即使有一些已知的 hacky work arounds。
解决方案是始终使用始终可用且专用于此目的的应用程序存储目录。如果您不使用该目录,那么您就是通过尝试在根据定义受保护且沙盒化以防止任何类型的修改的文件夹中工作来创建自己的问题的人。
如果您坚持这样做,那么您可能会像我说的那样找到一些变通办法,但您永远无法保证您的变通办法在每个 OS 或任何未来 OS 之后都能正常工作更新。
您的应用可能会在 OS 更新后或已经在具有更高安全设置的某些 OS 上中断,这只是因为您有根据地决定违反规则。
我再次建议使用应用程序存储目录,而不是为此目的专门设置的沙盒,这是在这种情况下唯一正确的答案。