7yue's Weblog

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

« 招募产品Pre-release评测开发精英关于Pre-release评测开发人员招募更新说明 »

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

第三部分,咱们接着上两部分继续。上两部分介绍了如何通过AIR创建文件夹,今天这部分是讲解一下文件夹的Move和Copy的部分,Move和Copy,两者非常相似,但有所不同,而且Move和Copy有时候会产生一些困惑,这里也一并解释一下。

我想,moveTo和copyTo两个方法都在帮助上描述的非常规矩,大多数人(尤其是做开发的)都应该可以看懂,那么我们先从困惑和要点着手,直切要害。我们现在要实现把一个文件夹移动到另外一个文件夹下去,被移动的那个文件夹,下面有文件存在,如果按照刚刚参考的API的开发方式来做,我们应该是按照下面的逻辑:

1. 找到源文件夹(被移动的)路径和名称
2. 找到目标文件夹的路径和名称
3. 用moveTo方法将源文件夹移动到目标文件夹

很好理解,那么对应的代码片段就是:

private function moveDirectory():void{
  var source:File=File.desktopDirectory.resolvePath("originalDirectory");
  var destination:File=File.desktopDirectory.resolvePath("movedDirectory");
  try{
    source.moveTo(destination);
  }catch(error:Error){
    trace(error.message);
  }
}


有人叫喊了..."错了!!!!",我知道错了,相信有实战经验的开发人员知道上面的代码有错,但对于刚接触此部分API的朋友而言,上述代码似乎看上去没有问题,将桌面上originalDirectory的文件夹移动到movedDirectory文件夹中去,代码貌似是应该这样。错在哪里?我们通过执行来验证一下:
错误类型一,你的桌面上如果没有originalDirectory,会有错误,错误描述是:Error #3003: File or directory does not exist。Flex会在Debugging状态下告知你上述错误。很好理解是不是,因为你不能移动一个不能存在的文件夹。
错误类型二,你桌面上有originalDirectory,没有movedDirectory,程序执行了,庆祝一下。结果很糟糕,不是我们想要的结果(将originalDirectory移动到名称为movedDirectory文件夹中去),而是originalDirectory消失了,剩下的是一个新建立的movedDirectory文件夹。
错误类型三,你桌面上有originalDirectory,有movedDirectory,程序执行出错,很糟糕,错误信息为Error #3012: Cannot delete file or directory,不能删除文件或文件夹。
看到这里,很多人困惑了,将originalDirectory目录移动到movedDirectory中的正确方式是怎样的?看下面这行针对上面改过的代码:

var destination:File=File.desktopDirectory.resolvePath("movedDirectory/originalDirectory");

运行结果,originalDirectory文件夹被移动到了movedDirectory,很难理解是不是,但是这就是正确的方式。我们必须指明originalDirectory被移动后的详细路径,包括originalDirectory名字本身。
进一步讨论,将originalDirectory从movedDirectory中重新手动移动回桌面(2个文件夹都在桌面),在movedDirectory文件夹中再创建一个文件夹,也叫做originalDirectory,运行程序,发生什么?出现错误,File or directory does not exist。看来我们需要多做一点在文件夹向目标文件夹内移动时,需要允许覆盖,否则也会报错。再对代码做略微改动:

source.moveTo(destination,true);

moveTo方法有一个overwrite属性,默认是false,不允许文件夹在移动过程中出现同名覆盖的现象,改为true,将会把目标同名文件夹覆盖,这样,moveTo的问题基本已经解决。
但是我们还想再探究一下,如果文件夹里有文件,怎么办,我们现在先将originalDirectory移动回桌面,再在originalDirectory文件夹内建立一个测试文本,我这里叫做1.txt。我们仍然使用这段代码:

private function moveDirectory():void{
  var source:File=File.desktopDirectory.resolvePath("originalDirectory");
  var destination:File=File.desktopDirectory.resolvePath("movedDirectory/originalDirectory");
  try{
    source.moveTo(destination);
  }catch(error:Error){
    trace(error.message);
  }
}

没有问题,连同1.txt文件一起,originalDirectory被移动到了movedDirectory下。如果movedDirectory文件夹下有一个同名的originalDirectory,那么同样需要打开moveTo的overwrite属性。看来,这个moveTo的问题已经搞清楚,那就是moveTo需要全部指明被移动文件夹在目标文件夹的全部路径,包括它的自己的名称。而moveTo的操作只要在对被移动和目标文件夹的设置操作得当,所有被移动的子文件(夹)都会被一并操作,这时为了避免出错,就要打开覆盖。如果你不想这样,就不能使用moveTo,转而应该使用copyTo,就是文件夹的拷贝功能。下期再接着讲,今天就到这里。

  • quote 1.sleep2death
  • 让我想起了大学里java老师的课堂...
    7yue 于 2009-3-3 16:36:24 回复
    haha,that is what I want to have.
  • 2009-3-3 16:36:24 回复该留言
  • quote 2.三月
  • 如果目标文件夹下面也有文件,我测试了一下就被删除了,就比如movedDirectory/originalDirectory下原来有2.txt文件,使用source.moveTo(destination,true)之后,2.txt文件就没有了。AIR中的“覆盖”的概念好像和windows下不同,如果要象windows下这样的覆盖操作,是不是只能将目标文件夹中的文件移动到临时文件夹中,然后等source.moveTo(destination,true)之后才移回来呢?
  • 2009-3-9 22:21:50 回复该留言

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 91204

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