/ / Jak napisać plik XML, który jest już otwarty przy pomocy URLLoader w as3? - xml, Actionscript-3, xml-parsing, air, flex4,5

Jak napisać plik XML, który jest już otwarty za pomocą URLLoader w as3? - xml, actionscript-3, xml-parsing, air, flex4.5

Mam XML, który jest w aplikacjikatalog Muszę zmodyfikować ten plik XML. Najpierw ładuję ten plik XML za pomocą URLLoder, używając poniższych kodów, a następnie modyfikuję XML, a gdy próbuję zapisać plik XML w tej samej lokalizacji o tej samej nazwie, nie działa. Jeśli zmienię nazwa pliku na coś innego, to działa dobrze. Więc moim problemem jest to, że chcę zmodyfikować plik XML i zapisać go w tej samej lokalizacji o tej samej nazwie. Jak mogę to osiągnąć?

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

Odpowiedzi:

2 dla odpowiedzi № 1

Aby uniknąć tego problemu, musisz otworzyć plik asynchronicznie, używając FileStream.openAsync(), więc Twój kod może wyglądać tak:

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();

Nadzieja, która może pomóc.


0 dla odpowiedzi nr 2

Dlaczego otwierasz plik za pomocą URLRequest zamiast FileStream? Możesz użyć FileMode.UPDATE robić obie rzeczy synchronicznie.

Na przykład:

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();

Uwaga:

  • Sprawdzasz tempFile.exists ale nic z tym nie robiąc. Nie jestem pewien, co próbujesz tam zrobić, więc to pominąłem.
  • Możesz odczytywać i zapisywać ciągi XML bezpośrednio do plików za pomocą readUTFBytes() i writeUTFBytes().
  • Budowanie natywnych adresów URL ścieżek plików przy użyciu literałów łańcuchowych, takich jak, nie jest dobrą praktyką nativePath + "\assets", posługiwać się resolvePath zamiast (zobacz dokumentację).
  • Nie jestem do końca pewien, co próbujesz zrobić application.xml. Wygląda trochę jak próbujesz zezwól na uruchomienie wielu wystąpień aplikacji, ale applicationDirectory/assets/data/application.xml o ile wiem, nie jest to właściwa ścieżka, w której możesz dołączyć własny plik XML. Może tworzysz narzędzie do tworzenia aplikacji AIR?

0 dla odpowiedzi № 3

Problem polega na tym, że katalog aplikacji tow piaskownicy i pliki tam nie powinny być w żaden sposób modyfikowane. Odnosi się to do każdej technologii, chociaż istnieją pewne znane, hackerskie rozwiązania.

Rozwiązaniem jest zawsze korzystanie z aplikacjikatalog przechowywania, który jest zawsze dostępny i przeznaczony do tego właśnie celu. Jeśli nie używasz tego katalogu, to sam tworzysz swój problem, próbując pracować w folderze, który jest z definicji chroniony i umieszczony w piaskownicy przed jakimikolwiek modyfikacjami.

Jeśli nalegasz na to, możesz znaleźć obejścia, tak jak powiedziałem, ale nigdy nie będziesz mieć żadnych gwarancji, że obejdziesz się na każdym systemie operacyjnym lub po jakichkolwiek przyszłych aktualizacjach systemu operacyjnego.

Twoja aplikacja może się zepsuć po aktualizacji systemu operacyjnego lub może już działać w niektórych systemach operacyjnych z wyższymi ustawieniami zabezpieczeń tylko z powodu świadomej decyzji o złamaniu zasad.

Ponownie zalecam użycie zamiast tego katalogu przechowywania aplikacji, który jest specjalnie do tego celu wydzielony w piaskownicy i jest to jedyna poprawna odpowiedź w tym przypadku.