今天下午复试,面试官引导我写出文件夹下内容重复的文件去重。然后自己在黑板上写了好久没理清楚,现在写出来了,记录一下,如有不对,请各位大佬指出,或者有更好的方式请指导
首先用到md5_file()因为之前也没接触过这个函数 在这里看下手册
md5_file() 函数计算文件的 MD5 散列。
md5_file() 函数使用 RSA 数据安全,包括 MD5 报文摘要算法。
来自 RFC 1321 的解释 - MD5 报文摘要算法:MD5 报文摘要算法将任意长度的信息作为输入值,并将其换算成一个 128 位长度的"指纹信息"或"报文摘要"值来代表这个输入值,并以换算后的值作为结果。MD5 算法主要是为数字签名应用程序而设计的;在这个数字签名应用程序中,较大的文件将在加密(这里的加密过程是通过在一个密码系统下[如:RSA]的公开密钥下设置私有密钥而完成的)之前以一种安全的方式进行压缩。
这里有两种写法
大神写给我的
class filesss
{
private $files = [], $other = [] ,$directory = 'F:/phpstudy/WWW/test';
public function getFiles($directory = '')
{
$dirHandle = opendir($this->directory);
if(!$dirHandle) contniue;
while(($file = readdir($dirHandle)) !== false)
{
if($file != '.' && $file != '..')
{
$path = $directory.$file;
if(is_file($path))
{
$md5_file = md5_file($path);
if(!isset($this->files[$md5_file]))
$this->files[$md5_file] = $path;
else
$this->other[$md5_file][] = $path;
}
elseif(is_dir($path))
{
$xxxxx = $this->getFiles($path.DIRECTORY_SEPARATOR);
if(is_array($xxxxx) && !empty($xxxxx))
{
if(!empty($xxxxx['file'])) $files = array_merge($files,$xxxxx['files']);
if(!empty($xxxxx['other'])) $files = array_merge($files,$xxxxx['other']);
}
}
}
}
return ['files'=>$this->files,'other'=>$this->other];
}
}
$files = (new filesss())->getFiles();
echo "<pre>";
print_r($files);
一个是我写的
$dir = "F:/phpstudy/WWW/test"; //要获取的目录
//$dir = "F:/phpstudy/WWW";
function deepScanDir($dir) {
$fileArr = array ();
$dirArr = array ();
$arr = array();
$newarray = array();
$dir = rtrim($dir, '//');
if (is_dir($dir)) {
$dirHandle = opendir($dir);
while (false !== ($fileName = readdir($dirHandle))) {
$subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
if (is_file($subFile)) {
$fileArr[$subFile] = md5_file($subFile);
} elseif (is_dir($subFile) && str_replace('.', '', $fileName) != '') {
$dirArr[] = $subFile;
$arr = deepScanDir($subFile);
//$dirArr = array_merge($dirArr, $arr['dir']);
$fileArr = array_merge($fileArr, $arr['file']);
}
}
closedir($dirHandle);
}
return array (
// 'dir' => $dirArr,
'file' => $fileArr
);
}
echo "<pre>";
$file=deepScanDir($dir);
print_r($file);
print_r(array_unique($file['file']));