7yue's Weblog

Thinking in RIA Solutions...2470,8514,1020的生活演绎

« 文章预告:AIR API详解AIR 1.5升级至1.5.1 »

AIR APIs详解-文件系统访问 Part1

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"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
  <mx:Script>
  <![CDATA[
  import flash.filesystem.File;
  private function createDirectory():void{
    var newDirectory:File =File.desktopDirectory.resolvePath("我的AIR文件夹");
    newDirectory.createDirectory();
  }
  ]]>
  </mx:Script>
  <mx:Button label="创建一个新文件夹" click="createDirectory()"/>
</mx:WindowedApplication>


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

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

  • quote 7.richard
  • 照搬源码过去,可是调试怎么告诉我
    Multiple markers at this line: -1120: 访问的属性 File 未定义。 -1046: 找不到类
    型,或者它不是编译时常数: File。
    跟我用的eclipse+flex_sdk_3.2有关系么?
  • 2009-2-26 14:50:20 回复该留言
  • quote 8.7yue
  • http://www.7yue.com
  • 有关系,因为你用的eclipse+flex 3.2 sdk极有可能是free open source Flex sdk的版本,你可以换用adobe Flex sdk 3.2,里面包含对AIR 1.5和FP10的支持。而free opensource flex SDK里面没有AIR SDK支持。
    区别可以看这里的描述:
    http://opensource.adobe.com/wiki/display/flexsdk/Downloads
  • 2009-2-26 16:24:46 回复该留言
  • quote 9.richard
  • 好像跟这个还没关系,换了家里的电脑同样的sdk就可以,不知道跟其他安装的程序有没有关系啊,比如要不要装flash cs,或者其他?有点有病乱投医的感觉。
  • 2009-2-27 10:58:31 回复该留言

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 91204

Copyright 2007 www.7yue.com. Some Rights Reserved.
京ICP备05064035号