2016-04-08 5 views
0

Ich habe eine XML, die innerhalb des Anwendungsverzeichnisses ist Ich muss diese XML - Datei ändern.Zunächst lade ich diese XML mit URLLoder mit den folgenden Codes und dann die XML ändern und wenn ich versuche, die XML - Datei an der gleichen Stelle mit dem zu schreiben Der gleiche Name funktioniert nicht.Wenn ich den Dateinamen zu etwas anderem ändere, dann funktioniert es gut. Also mein Problem ist, dass ich die XML-Datei ändern und am selben Ort mit dem gleichen Namen speichern möchte.Wie kann ich erreichen Dies?Wie schreibe ich eine XML-Datei, die bereits mit URLLoader in as3 geöffnet wurde?

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

Antwort

2

dieses Problem zu vermeiden, müssen Sie Ihre Datei FileStream.openAsync() asynchron öffnen verwenden, so kann der Code wie folgt sein:

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

Hoffnung, die helfen können.

+0

Dank @akmozo für Ihre Antwort !!!!! Das ist was ich suche. – Ashish

0

Warum öffnen Sie die Datei mit einer URLRequest statt einer FileStream? Sie können FileMode.UPDATE verwenden beide Dinge synchron zu tun.

Zum Beispiel:

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

Hinweis:

  • Sie sind für tempFile.exists Kontrolle, aber nicht mit ihm etwas zu tun. Ich bin mir nicht sicher, was Sie dort machen wollen, also habe ich es weggelassen.
  • Sie können XML-Zeichenfolgen direkt in Dateien lesen und schreiben, indem Sie readUTFBytes() und writeUTFBytes() verwenden.
  • Es ist keine gute Vorgehensweise, native Dateipfad-URLs mit Zeichenfolgenliteralen wie nativePath + "\\assets" zu erstellen, stattdessen verwenden Sie stattdessen resolvePath (see docs).
  • Ich bin mir nicht sicher, was Sie mit application.xml zu tun versuchen. Es sieht ein bisschen wie Sie versuchen, allow multiple instances of your app to be started, aber applicationDirectory/assets/data/application.xml ist nicht der richtige Weg, soweit ich weiß, das ist, wo Sie Ihre eigene XML-Datei enthalten können. Vielleicht machen Sie ein AIR App Builder-Dienstprogramm?
0

Das Problem ist, dass das Anwendungsverzeichnis in einer Sandbox ist und Dateien darin nicht in irgendeiner Weise geändert werden sollen. Dies gilt für jede Technologie, auch wenn einige Hacky Work arounds bekannt sind.

Die Lösung besteht darin, immer das Anwendungsspeicherverzeichnis zu verwenden, das immer verfügbar und für diesen Zweck gedacht ist. Wenn Sie dieses Verzeichnis nicht verwenden, erstellen Sie Ihr eigenes Problem, indem Sie versuchen, in einem Ordner zu arbeiten, der per Definition geschützt und gegen Änderungen jeglicher Art geschützt ist.

Wenn Sie darauf bestehen, finden Sie vielleicht einige Arbeitsumgebungen wie ich sagte, aber Sie werden nie garantieren, dass Ihre Arbeit auf jedem Betriebssystem oder nach zukünftigen Betriebssystemaktualisierungen funktioniert.

Ihre App könnte nach einem Betriebssystemupdate oder bereits auf einem Betriebssystem mit einer höheren Sicherheitseinstellung aufgrund Ihrer fundierten Entscheidung, die Regeln zu brechen, brechen.

Noch einmal empfehle ich, stattdessen das Anwendungsspeicherverzeichnis zu verwenden, das speziell für diesen Zweck sandboxed ist und das ist die einzige richtige Antwort in diesem Fall.

Verwandte Themen