今日在做一个打包文件的功能,打包完成后要删除临时文件夹,结果调用删除方法总是无法删除,单独调用删除方法则无问题,那么问题在哪呢?
下面先描述下打包流程:
1、创建临时文件夹
mkdir($tempPath, 0755, true);
2、寻找要打包的文件,复制到临时文件夹下
使用命令:
is_dir
、file_exists
、copy
function _copydir($source, $target, $filename){
$handle = opendir($source);
$i = 1;
while (($item = readdir($handle)) !== false) {
if ($item == '.' || $item == '..') continue;
$_source = $source . $item;
if (is_dir($_source)){
$this->_copydir($_source, $target);
}
if (is_file($_source)){
$_name = basename($_source);
$_ext = substr($_name, strpos($_name, '.'));
$_target = $target . '/' . $filename.'_'.$i.$_ext;
copy($_source, $_target);
$i++;
}
}
closedir($handle);
}
3、进入到临时文件夹上级目录下 !注意这里
使用命令:
chdir
4、判断是否已存在打包文件,存在则删除
使用命令:
file_exists
、unlink
5、打包文件
使用命令:
exec
、zip
6、删除临时文件夹
function _deleteDir($dir) {
if (!$handle = @opendir($dir)) {
return false;
}
while (false !== ($file = readdir($handle))) {
if ($file !== "." && $file !== "..") { //排除当前目录与父级目录
$file = $dir . $file;
if (is_dir($file)) {
$this->_deleteDir($file);
} else {
@unlink($file);
}
}
}
closedir($handle);
@rmdir($dir);
}
问题就出在这里了,调用这个方法无效果,那么到底是什么原因呢?
我猜测可能是当前执行路径不对,所以我在调用删除方法前再次执行chdir
,将当前路径变成初始路径,再次执行,这次就成功了。
知识点:
使用
chdir
函数时要注意执行路径