Próbuję odczytać plik xml do pamięci, dodać węzeł, a następnie napisać oryginalny plik.
Poniższy kod działa dobrze (usuwa plik, a następnie zapisuje nowe bajty u góry):
var stream:FileStream = new FileStream();
stream.open(file, FileMode.UPDATE);
stream.position = 0;
stream.truncate();
stream.writeUTFBytes("<?xml version="1.0" encoding="utf-8"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();
Jeśli jednak spróbuję wykonać odczyt po otwarciu pliku, wywołania position / truncate nie działają:
var stream:FileStream = new FileStream();
stream.open(file, FileMode.UPDATE);
var xml:XML = XML(stream.readUTFBytes(stream.bytesAvailable));
// Modify xml here
stream.position = 0;
stream.truncate();
stream.writeUTFBytes("<?xml version="1.0" encoding="utf-8"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();
Czy ktoś ma jakieś pomysły, dlaczego to nie działa?
Jeśli zbadasz strumień, w pierwszym kodziepo wywołaniu funkcji truncate () właściwość bytesAvailable będzie czytać 0. Ale w drugim kodzie funkcja bytesAvailable nie zmieni się (pokaże bieżący rozmiar pliku).
Odpowiedzi:
1 dla odpowiedzi № 1zamknij strumień po skrócie (), a następnie otwórz go ponownie. LUB zamiast tego użyj openAsync.
stream.position = 0;
stream.truncate();
stream.close();
stream.open(file, FileMode.UPDATE);
stream.writeUTFBytes("<?xml version="1.0" encoding="utf-8"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();
LUB
var stream:FileStream = new FileStream();
stream.openAsync(file, FileMode.UPDATE);
stream.position = 0;
stream.truncate();
stream.writeUTFBytes("<?xml version="1.0" encoding="utf-8"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();