代码之家  ›  专栏  ›  技术社区  ›  Mark Ingram

在调用filestream.readutfBytes()(Adobe Air)之后,filestream.truncate()不起作用。

  •  0
  • Mark Ingram  · 技术社区  · 16 年前

    我正在尝试将XML文件读取到内存中,添加一个节点,然后重写原始文件。

    以下代码工作正常(它清除文件,然后在顶部写入新的字节):

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

    但是,如果我试图在文件打开后执行读取,则位置/截断调用不起作用:

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

    有人知道为什么这不管用吗?

    如果在第一个代码中检查流,在调用truncate()之后,bytesavailable属性将读取0。但是在第二个代码中,可用的字节不会改变(它将显示当前的文件大小)。

    1 回复  |  直到 14 年前
        1
  •  1
  •   kurt Mossman    15 年前

    在truncate()之后关闭流,然后再次打开它。或者使用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();
    

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