FileReference.save确保它具有扩展名

时间:2015-01-15 10:54:17

标签: actionscript-3 air

我需要使用一些设置保存XML,并希望将它们保存为我自己的文件类型(例如.genconf)。当我使用..

var f:FileReference = new FileReference();
f.save( MyByteArray);

..我可以允许用户浏览保存,但如果他们手动输入(他们肯定不会),它只使用扩展名。

有没有办法检查他们输入的文件名,并在写入文件之前修改/附加它?

2 个答案:

答案 0 :(得分:3)

这里是我最终如何做到的(使用AIR):

//on save clicked
public function export(e:MouseEvent){
    var file:File = File.desktopDirectory;
    file.browseForSave("Save");
    file.addEventListener(Event.SELECT, onSaveSelect);
}

public function onSaveSelect(e:Event){
    //create XML stuff here
    var config:XML = new XML(<config />)

    // compressing before saving
    var bytes:ByteArray = new ByteArray();
    bytes.writeUTFBytes( config );
    bytes.compress();

    //get browse location
    var saveFile:File = File(e.target);
    var directory:String = saveFile.url;

    //check if by miracle they put the extension in, then add it
    if(directory.indexOf(".genconf ") == -1){
        directory += ".genconf ";
    }

    //use the new path with the extension
    var file:File = new File();
    file = file.resolvePath(directory);

    var fileStream:FileStream = new FileStream();
    fileStream.addEventListener(Event.CLOSE, onClose);
    fileStream.openAsync(file, FileMode.WRITE);
    fileStream.writeBytes(bytes);
    fileStream.close();
}

答案 1 :(得分:1)

我认为出于Flash安全原因,您无法以任何方式强制执行文件扩展名,此外,用户键入的文件名是只读信息,因此您无法对其进行修改。

因此,对于您的情况,您希望保存带有.genconf扩展名的文件,我认为您可以:

  • 在显示保存对话框之前向用户请求文件名,然后添加扩展名以使用保存对话框的默认文件名。

OR

  • 使用时间戳,随机名称,...以及要求用户直接保存文件而不编辑名称,使用您的扩展名修复默认文件名。

在所有情况下,您都会得到如下代码:

const extension:String = '.genconf';

var file_ref:FileReference = new FileReference()    
    file_ref.save('your_data', 'default_file_name' + extension);

希望可以提供帮助。