FileReference.save 确保它有扩展名

FileReference.save ensuring it has extension

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

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

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

有没有办法在写入文件之前检查他们输入的文件名,amend/append?

我认为出于Flash安全的原因,您不能以任何方式强制文件扩展名,另外用户输入的文件名是只读信息,因此您不能修改它。

所以对于你的情况,你想保存扩展名为 .genconf 的文件,我认为你可以:

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

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

在所有情况下,您都会得到这样的代码:

const extension:String = '.genconf';

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

希望能帮到你。

这是我最终的做法(使用 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();
}