私のAir2.5アプリケーションは、いくつかのカスタムフォルダ内にいくつかのテキストファイルを保存する必要があります。
現在、ドキュメントフォルダを使用してファイルを保存しています(FileStreamを使用)。これは正常に機能します。しかし、私はそれを任意のフォルダ内に保存する必要があります。
ターゲットフォルダにファイルを保存する方法はありますか?(FileStreamを使用)
私のAir2.5アプリケーションは、いくつかのカスタムフォルダ内にいくつかのテキストファイルを保存する必要があります。
現在、ドキュメントフォルダを使用してファイルを保存しています(FileStreamを使用)。これは正常に機能します。しかし、私はそれを任意のフォルダ内に保存する必要があります。
ターゲットフォルダにファイルを保存する方法はありますか?(FileStreamを使用)
1.5以降のAdobeAIRのドキュメントによると:
ユーザーのコンピューターに管理者の制限がない限り、AIRアプリケーションはユーザーのハードドライブ上の任意の場所に書き込むことができます。
開発者向けのベストセキュリティプラクティスもお読みください。
したがって、例として、次を使用してデスクトップにアクセスできます。
File.desktopDirectory.resolvePath(your_path);
管理者権限がある場合は、ファイルをどこにでも保存できますが、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);
私は実用的な解決策を持っています。ターゲットフォルダにファイルを保存します。それはあなたを助けるかもしれません。
/*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");
}