WordPress 在 2.5 版本的时候就引入了 copy_dir() 方法用于将整个目录从一个位置复制到另外一个,该函数会通过递归的方式创建相应子目录并将文件复制到新文件夹中它们各自的位置。
但是 WordPress 并没有提供移动文件目录方法,这样意味着在 WordPress 如要移动某个目录,就要首先使用 copy_dir() 函数先复制整个目录到目标位置,然后再删除原始位置的目录。
这样就会花费更多的内存,磁盘空间,时间和文件操作,但是移动目录不应该这样,它应该更快更可靠,也应该更易调用。
所以 WordPress 6.2 就引入了 move_dir()
函数用于移动目录,该函数有如下参数:
成功则返回 true
,失败则返回 WP_Error 对象,如果移动操作失败,move_dir()
则会回退到 copy_dir() 操作,如果 copy_dir()成功,则会自动删除源目录。
失败可能包含以下情形:
$overwrite
是 false ,但是目标位置已存在。$overwrite
是 true
,但是无法删除已存在的目标位置。在底层 move_dir()
使用 WP_Filesystem_Direct、 WP_Filesystem_FTPext、WP_Filesystem_ftpsockets, 和 WP_Filesystem_SSH2 等文件系统的方法 move()
。
move_dir()
不仅比 copy_dir() 和 delete 的组合操作更直观,而且速度也快得多,并且也消耗更少的服务器的磁盘空间和内存。
需要注意的是 OPcache 对所有移动的文件都无效,这个可以通过 WordPress 6.2 新引入的 wp_opcache_invalidate_directory()
函数来解决。
如果开始使用 move_dir()
函数,并且目标位置已经存在,那就记得 $overwrite
参数要设置为 true
:
$result = move_dir( $from, $to, $overwrite );
if ( is_wp_error( $result ) ) {
return $result;
}