我想,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中重新手动移动回桌面(2个文件夹都在桌面),在movedDirectory文件夹中再创建一个文件夹,也叫做originalDirectory,运行程序,发生什么?出现错误,File or directory does not exist。看来我们需要多做一点在文件夹向目标文件夹内移动时,需要允许覆盖,否则也会报错。再对代码做略微改动:
source.moveTo(destination,true);
但是我们还想再探究一下,如果文件夹里有文件,怎么办,我们现在先将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);
}
}