是否可以在任何自定义文件夹中使用Air2或Air2.5保存文件?

时间:2012-07-09 10:20:38

标签: actionscript-3 file air save directory

My Air 2.5应用程序需要在某些自定义文件夹中保存一些文本文件。

目前我正在使用文档文件夹来保存文件(使用FileStream),这很好用。但我需要将其保存在任何文件夹中。

有没有办法在任何目标文件夹中保存文件? (使用FileStream)

3 个答案:

答案 0 :(得分:0)

自1.5以来Adobe AIR docs的内容很好:

  

除非用户计算机存在管理员限制,否则AIR应用程序有权写入用户硬盘上的任何位置。

另请阅读Best security practices for developers

举个例子,您可以使用以下方式访问桌面:

File.desktopDirectory.resolvePath(your_path);

答案 1 :(得分:0)

如果您拥有管理员权限,则可以将文件保存在File.ApplicationDirectory中的任何位置(但您将遇到安全性错误)。

但是有一个黑客:

var fs : FileStream = new FileStream;
var errorFile : File = File.applicationDirectory.resolvePath("foo.txt");

try{
    // Error
    fs.open(errorFile, FileMode.WRITE);
}catch(e:Error){
    trace("Security error");
}

var okFile : File = new File(File.applicationDirectory.resolvePath("foo.txt").nativePath);

// No error
fs.open(okFile, FileMode.WRITE);

答案 2 :(得分:0)

我有工作的解决方案。它将文件保存到您的目标文件夹。它可能会对你有帮助。

/*Requires AIR 2.5 (May be AIR 2.0. I have not tested) and Flash CS6.*/
import flash.filesystem.*;
import flash.utils.ByteArray;

//Sample XMl
var xml:XML = <audio>song1.mp3</audio>;
var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n';
outputString +=  xml.toXMLString();
outputString = outputString.replace(/\n/g,File.lineEnding);

//Byte array
var xmlData:ByteArray = new ByteArray();
xmlData.writeUTFBytes(outputString);

//Targeted custom folder
var urlStr:String = "file:///D:/Temp/"; // you can get this URL from external text file
var audioXMLFile:File = new File();
audioXMLFile.url = urlStr;
audioXMLFile = audioXMLFile.resolvePath("SongList.xml");

//File stream
var outStream:FileStream = new FileStream();
outStream.addEventListener(Event.CLOSE, dataSaved, false, 0, true);
outStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, savingProgress, false, 0, true);

//open output file stream in WRITE mode
outStream.openAsync(audioXMLFile, FileMode.WRITE);

//write out the file
outStream.writeBytes(xmlData, 0, xmlData.length);

//Saving progress
function savingProgress(e:OutputProgressEvent):void
{
    if (e.bytesPending == 0)
    {
        //Close stream on save
        e.target.close();
    }
}

// 
function dataSaved(e:Event):void
{
    trace("File Saved");
}