先说下我的应用场景,帮助大家看是否对自己有用。
我是打算用vue开发一个app,用hbuilder打包。vue每次build之后生成dist文件夹,然后要把dist文件夹复制到hbuilder创建的项目文件夹下。在进行开发调试的时候,要经常做这个动作,就很麻烦。
所以我就想写个脚本,让它自己检测每次dist的变化(vue每次build,会先删除旧的dist,然后重新生成),如果文件夹有变化,就自动把dist文件夹的内容复制一份到hbuilder创建的项目文件夹下,以免去每次手动复制的麻烦。
思路如下:
1. 检测要复制的目标文件夹是否存在(dist),如果不存在,就等3秒,然后跳过本次执行。如果文件夹存在,则获取文件夹的创建时间。
2. 用本次获取的文件夹创建时间与上次获取的时间(存在session中)比较,如果时间一致,则跳过本次执行,如果不一致,则执行复制文件操作。
3. 循环执行上述步骤,我设置的3秒执行一次。在每次执行完后必须执行下clearstatcache()函数。因为filectime()这个函数具有缓存,必须要清下缓存,不然每次获取的时间都是一个,我当初就卡这很久。关于clearstatcache()这个函数,具体可查看php手册。
4. 命令行模式下执行,让它一直循环就行了,就会不停的自动检测。
具体代码如下:
<?php
session_start();
set_time_limit(0);
/**
* 文件夹文件拷贝
*
* @param string $src 来源文件夹
* @param string $dst 目的地文件夹
* @return bool
*/
function dir_copy($src = '', $dst = '')
{
if (empty($src) || empty($dst))
{
return false;
}
$dir = opendir($src);
dir_mkdir($dst);
while (false !== ($file = readdir($dir)))
{
if (($file != '.') && ($file != '..'))
{
if (is_dir($src . '/' . $file))
{
dir_copy($src . '/' . $file, $dst . '/' . $file);
}
else
{
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
return true;
}
/**
* 创建文件夹
*
* @param string $path 文件夹路径
* @param int $mode 访问权限
* @param bool $recursive 是否递归创建
* @return bool
*/
function dir_mkdir($path = '', $mode = 0777, $recursive = true)
{
clearstatcache();
if (!is_dir($path))
{
mkdir($path, $mode, $recursive);
return chmod($path, $mode);
}
return true;
}
$src = "你的dist文件夹路径";
$dst = "你要复制的路径";
$_SESSION['time'] = filectime($src);
ob_start();
while (1) {
if (!is_dir($src)) {
sleep(3);
clearstatcache();
continue;
}
echo 'file: '.filectime($src);
echo "\n";
echo 'session: '.$_SESSION['time'];
echo "\n";
ob_flush();
flush();
$lastTime = filectime($src);
if ($lastTime != $_SESSION['time']) {
dir_copy($src, $dst);
$_SESSION['time'] = filectime($src);
}
sleep(3);
clearstatcache();
}