AIR最大的特点是利用开发人员掌握的Web技术来开发桌面应用。桌面应用有一个最为显著的特点,就是可以访问操作用户的文件系统,AIR也内置了访问用户文件系统的API集合。在我开始讲解这部分API前,你需要先知道一些创作应用的原则,这样可以保证你开发的AIR应用不被大多数用户反感。

原则1:AIR访问文件系统API具备了操作用户文件系统的强大能力,是一把双刃剑,请谨慎使用,不是每个用户都会因为你的AIR应用可以操作他们的本地文件系统而去体验下载和安装它,恰恰相反,他们极有可能对你的应用避而远之。
原则2:在你的应用文档和各方面描述中加入对于用户文件系统访问的具体描述,个人免费应用是为了确保用户知道这些功能的存在,而商业AIR应用更应该将这部分写入EULA中,否则极有可能在某一天收到法院的传票。
原则3:在应用中,当有事件触发访问用户文件系统的操作时,先给与用户必要的信息提示,待用户确认操作后再执行文件系统访问的功能,这样会非常友善,不至于你的应用遭到某些用户的强烈反感。

好了,原则说完了,开始解析技术的部分。
AIR访问文件系统的功能类全部来自一个扩展的API集合,flash.filesytem,其中包含了3个类File,FileStream和FileMode。这个文章没有对于这3个类的详细描述,你可以从下面的链接找到中文版本的类库参考:

AIR中文语言参考-访问文件系统部分

该文档是一个Language Reference,更加适合做为语言手册,随时查询。

File,FileStream和FileMode这三个类提供了用户通过AIR应用执行对于文件系统(文件和文件夹)的读,写,移动,拷贝和删除等任务,注意,AIR API中没有专门针对文件夹访问操作的类。为什么?很简单,我们对于文件系统的访问操作过程里,对于文件的操作,无时无刻都在牵扯到与之相关的文件夹操作(开发人员经常称为Directory Path或者Content Path)。你的操作可以使用File类的只读属性isDirectory来判断File对象实例是否指向文件夹还是文件。

在我们这个系列的API详解的文章中,我本人不会把Language Reference中与这三个类有关的所有属性和方法都讲一遍,实在是没有那个必要,所以在此再次强调Language Reference的重要性,那就是当你看懂我的文章后,你动手还是需要像Language Reference这样的帮助,我认为没有任何文档可以替代它。

File类的衍生关系相当清晰:File->FileReference->EventDispatcher-> Object,注意,FileReference就不是AIR独有的类了,而是来自于Flash Player的flash.net包。回到文件访问的API上来,有了上述的三个类,你可以通过他们实现在Windows,MACOSX和Linux上同样的操作,这就是跨平台。 文件类File有几个public标识符的属性非常重要,也是作为开发人员经常用到的,比如:

1. 只读属性exist,表示文件或文件夹是否存在,返回值是true或者false
2. 文件对象的路径url,字符串格式
3. 文件对象是否隐藏isHidden,布尔类型,返回值是true或者false
4. 文件对象是否是文件夹isDirectory,布尔类型,返回值是true或者false,对于这个属性,各位一定要牢记,以我的经验,用到次数最多的就是它。

此外,File类还有一些其他有用的静态属性,也值得提一下:

File.applicationStorageDirectory — 每个已安装的 AIR 应用程序独有的存储目录文件夹
File.applicationDirectory — 安装应用程序的只读目录(其中包括所有已安装的资源)
File.desktopDirectory — 用户的桌面目录
File.documentsDirectory — 用户的文档目录
File.userDirectory — 用户目录

语言参考对于上面的属性解释相当详细,而且很容易懂。文件类此外还有一些方法,比如copyTo,moveTo,deleteDirectory等等,我们以后的文章会单独进行解释。FileMode类和FileStream类,我们也在以后的文章中陆续讲解。一句话,分来了慢慢讲,贪多嚼不烂,:)

现在将告诉各位如何创建一个文件夹,借此来直接激发刚刚接触此部分API开发人员的积极性。简单而言,基于文件系统创建一个文件夹非常简单,一般来说分成2步:

1. 创建一个File对象,赋予一个不存在的文件夹路径
2. 基于该对象使用createDirectory()方法

通过上面的2个步骤,我们直接来看一段代码:

< ?xml version="1.0" encoding="utf-8"?>


< ![CDATA[
import flash.filesystem.File;
private function createDirectory():void{
var newDirectory:File =File.desktopDirectory.resolvePath("我的AIR文件夹");
newDirectory.createDirectory();
}
]]>

你尝试在FlexBuilder3里创建一个Flex Project,类型是AIR Desktop,之后,将上面的代码粘贴到你的MainApplication中,运行,看看你的桌面上是否多了一个叫做“我的AIR文件夹”的目录。这个例子中的中文文件夹名称完全没问题,只是建议你最好使用英文和数字来合理命名你的文件夹,以确保可以运行在其他语言的操作系统上,这里仅仅是为了测试直观方便才使用中文的。这里使用了desktopDirectory来将要创建的文件夹对象指向了你的桌面,请不要担心是windows还是MACOS,只管记住这个属性就好了。resolvePath这个方法将一个当前叫做“我的AIR文件夹”的命名附加到File对象上去来决定文件夹的命名,然后使用createDirectory方法来创建。

好了,现在你会通过AIR API创建一个新的文件夹了。当然你可能有更多需求,比如创建前检测一下之类的小功能,这也是完全可行的,那么我们下篇文章继续。

我们用到了File类的desktopDirectory这个内置属性,听这个名字,就知道是直接将AIR应用的File对象路径指向用户桌面。我们在前面就轻轻地提及了其他几个静态属性:

File.applicationStorageDirectory — 每个已安装的 AIR 应用程序独有的存储目录文件夹
File.applicationDirectory — 安装应用程序的只读目录(其中包括所有已安装的资源)
File.documentsDirectory — 用户的文档目录
File.userDirectory — 用户目录

我认为有必要进一步做个解释了,因为有人可能会在这里有疑问。且看下面:

开发者疑问:为什么File类就要带这几个静态属性,如果我的AIR应用是要访问用户C盘或者D盘路径下的某个文件夹呢,是不是不允许?
我的回答是,AIR在File类提供这几个静态属性,是为了保证开发人员使用这些静态属性的值去访问用户文件系统时,能够高度保持应用跨平台的一致性。就像前面的例子里的这部分代码:

var newDirectory:File =File.desktopDirectory.resolvePath(”我的AIR文件夹”);
newDirectory.createDirectory();

当Windows用户执行AIR应用时,desktopDirectory会自动帮你映射到Windows系统的桌面路径;而同样的应用,当被MACOSX用户执行时,desktopDirectory也同样会自动帮你映射到MACOSX的桌面上去,这就通过了desktopDirectory保证了跨平台应用访问路径的一致性。再深究一下,desktopDirectory属性在我的Windows下指的是:

C:\Documents and Settings\zma\Desktop\

而在我的MACOSX下则指向:

/Users/zma/Desktop/

如果按照开发者说的,随意指定一个系统路径来访问文件系统,未尝不可。假定前面随意路径就是指向我windows系统的桌面,我就可以这样去定义:

var newDirectory:File =new File(”C:\\Documents and Settings\\zma\\Desktop\\我的AIR文件夹”);
//或者你使用正斜杠
//var newDirectory:File=new File(”C:/Documents and Settings/zma/Desktop/我的AIR文件夹”);
newDirectory.createDirectory();

结果一样,仍然会在Windows桌面上创建一个叫做我的AIR文件夹的目录,但是局限性就来了,因为你用这种方式只能工作在Windows操作系统里,假如你的应用中创建文件夹和文件是一个重要的工作(比如存储一个文件到某文件夹),你的应用在MACOSX系统里就完全不工作。有没有办法改正?有,用Flash Player API判断用户系统,然后用判断的结果值分开来写访问用户文件系统的逻辑,Win一套,MAC一套,Linux一套…乃至到未来的smartphone上一套,优点是灵活,缺点是代码工作量骤然提升。所以,推荐各位将访问文件系统的File对象尽量绑定在几个内置属性的映射路径上,既方便,又不用考虑目标系统,而且还友善,因为没有用户愿意你的AIR应用打开人家C盘windows文件夹去生成一个目录或新文件,MACOSX就好很多,因为要sudo才能获得某些文件夹的读写和创建删除权限。所以,AIR应用推荐使用File的几个默认内置静态属性,你好我好大家好,皆大欢喜。