如何将文件放入应用程序目录并保存?(Adobe Air)

11

如何将文件保存到您的应用程序目录中?(Adobe Air)(请提供示例代码)

7个回答

17

虽然不推荐,但确实可能。按照以下方式构建您的文件引用:

var pathToFile:String = File.applicationDirectory.resolvePath('file.txt').nativePath;
var someFile:File = new File(pathToFile);

我不知道是谁不推荐,但这可能是创建一个随应用程序一起被删除的设置文件的唯一方法。 - Cristi Băluță
在发布版本中,如果您尝试写入,此代码将失败!ADL允许您在应用程序目录中编写文件,但不允许在AIR的发布版本中进行。整个应用程序在加载时都会进行校验和检查。 - ansiart
@ansiart 使用这个解决方案,我导出了一个发布版本并进行了安装。我运行了应用程序,没有任何问题。我关闭了应用程序,再次运行时没有遇到校验和错误。我确认我的复制文件仍然存在于应用程序目录中。(FB4.6)我还检查了air包,确认我没有意外地将文件放在发布版本中。是否有一些选项我忽略了,导致这个解决方案出现问题? - CrashCodes
不过需要提醒的是 - 根据 AS3 文档,“在 Android 上,指向应用程序目录的 File 对象的 nativePath 属性为空字符串。” - analytik
非常好用,谢谢。此外,作为开发人员,需要将文件保存到应用程序目录的一个非常有效的场景是,当您在appDir中有所有资源文件夹,并且还有一个自定义打包程序,可以创建一个包含所有这些资源的单个容器文件时。应用程序能够打开其中任何一个,但在开发过程中,您将使用文件夹,而在发布时,您将发送打包的容器文件。如果您可以简单地在其位置创建它,那么移动打包文件会更加复杂。 - Florin Mircea

9
您无法向AIR应用程序的应用程序目录写入内容,这是不允许的。但是,您可以将内容写入用户目录中的AIR应用程序创建的文件夹中,称为应用程序存储目录。如果您需要配置文件等内容,那么这可能是最好的放置位置。请参见下面文档链接中的“applicationDirectory”: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/

4

@glendon 如果您尝试直接保存到 applicationDirectory,它确实会抛出一个错误,但是您似乎可以在文件系统中移动该文件。我在您的代码之后使用了以下代码:

var sourceFile:File = File.applicationStorageDirectory.resolvePath ("file.txt");
var pathToFile:String = File.applicationDirectory.resolvePath ('file.txt').nativePath;
var destination:File = new File (pathToFile);
sourceFile.moveTo (destination, true);

使用应用程序文件夹的原因是不是所有用户都有权限在这样的文件夹中保存文件,而每个人都可以在应用程序存储目录中保存。请注意,“shouldnt”中的引号是为了表示“不应该使用应用程序文件夹”的意思。

好的解决方案。嗯...我应该在我的AIR桌面应用程序中使用应用程序文件夹。谢谢。 - Brownsoo Han

2

被接受的答案有效!

但如果我用这个方法:

var vFile = File.applicationDirectory.resolvePath('file.txt');
var vStream = new FileStream();
vStream.open(vFile, FileMode.WRITE);
vStream.writeUTFBytes("Hello World");
vStream.close();

如果我使用applicationStorageDirectory而不是applicationDirectory,上述代码将会起作用。如果使用applicationDirectory,它将会报SecurityError: fileWriteResource错误。此外,Adobe的文档还指出,AIR应用程序无法写入其applicationDirectory目录。

现在,我想知道是否是Adobe的一个bug,他们允许使用被接受答案建议的方式来写入applicationDirectory。


在 Mac 上,我能够使用 applicationDirectory 在以下路径创建文件夹: /Users/administrator/Library/Preferences/Main/Local Store/thumbAppStorageDir,但之后我无法再次运行相同的代码行。很奇怪。 - Ankit Tanna

1

试试这个。

var objFile:File = new File(“file:///”+File.applicationDirectory.resolvePath(strFilePath).nativePath);

输出将会是这样的...

file:///c:\del\userConf.xml

这将很好地工作。


1

如果您想将文件写入ApplicationDirectory,对吧?

请不要忘记通过powershell和注册表键为您当前的Adobe应用程序编写nativeprocess(例如:C:\Program Files (x86)\AirApp\AirApp.exe with RunAsAdmin)

  1. nativeprocess保存新的注册表文件
  2. AirApp将重新启动为RunASAdmin
  3. AirApp可能是可写的,可能有文件:)

别担心!

我知道这个技巧,就像有时应用程序首先通过注册表文件进行编写,并通过将nativeprocess写入注册表文件到注册表结构来调用powershell。

看起来我的建议来自adobe系统板/论坛比使用文件访问问题更好:)

我希望您因为您知道我的nativeprocess技巧通过powershell + regedit /s \AirApp.reg 和AirApp变成administratived AirApp,然后它可以在Administratived模式下正常工作:) 那么您的解决方案应该编写并尝试-确保通过AirApp进行编写过程。


0

这个函数可以获取当前的AIR应用程序文件夹,从而绕过安全问题:

function SWFName(): String {
        var swfName: String;
        var mySWF = new File(this.loaderInfo.url).nativePath;
        swfName= this.loaderInfo.loaderURL;
        swfName = swfName.slice(swfName.lastIndexOf("/") + 1); // Extract the filename from the url
        swfName = new URLVariables("path=" + swfName).path; // this is a hack to decode URL-encoded values
        mySWF = mySWF.replace(swfName, "");
        return mySWF;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接