php清理文件夾 WSTMALL處理的錯誤思想解析

2016-12-09 09:50:00
hainuo
原創 1856
在php7.1 下使用WSTMALL齣現一下問題,關於php的文件操作WSTMALL的處理方式如下```function WSTDelDir($dirpath){ $dh = opendir($dirpath); while (($file = readdir($dh))!==false) { //=====>C if ($file != "." && $file != "..") { $fullpath = $dirpath . "/" . $file; if (!is_dir($fullpath)) { unlink($fullpath); } else { WSTDelDir($fullpath); //=======>A rmdir($fullpath); } } } closedir($dh);//=========>B $isEmpty = 1; $dh = opendir($dirpath); while (($file = readdir($dh)) != false) { if ($file != "." && $file != "..") { $isEmpty = 0; break; } } return $isEmpty;}```我調試瞭一下髮現文件夾正常刪除,但是 最後總會遇到一箇TEMP文件夾內有文件。所以箇人感覺WSTMALL的刪除有問題。通過箇人跟蹤髮現 標記爲A處的命令併沒有執行第二次,隻執行到第一處就結束瞭。也就是説。這箇方法沒有深度遞歸。於是我用瞭另一箇opensns的實現```function WSTDelDir($dirname){ if (!file_exists($dirname)) { return 0; } if (is_file($dirname) || is_link($dirname)) { return unlink($dirname); } $dir = dir($dirname); if($dir){ while (false !== $entry = $dir->read()) { if ($entry == '.' || $entry == '..') { continue; } WSTDelDir($dirname . DIRECTORY_SEPARATOR . $entry); } } $dir->close(); return rmdir($dirname);}```對比之後髮現原來是原先的實現有問題。關鍵就在於 `B標記`之後.1. WSTMALL的寫法有讀取瞭一遍文件夾。這箇是有問題的。原因在於當前進程雖然在之前成功刪除瞭文件夾,但是併沒有保證其他進程不會生成緩存文件。所以WSTMALL的失敗就在此處。2. 另一點就是OPENSNS的處理方式,成功的刪除瞭所有緩存文件,而 WSTMALL無法成功處理也在於`B標記`之後的數據,他提前返迴瞭。併沒有循環完畢所有的目録。3. 最後説一下> 關於在PHP7.1正式版下爲什麽WSTMALL的清理方法不執行瞭。 原因是PHP7.1 修正一處bug 。[x] Fixed bug #72667 (opendir() with ftp:// attempts to open data stream for non-existent directories). 這導緻`opendir()`打開一箇不存在目録返迴的是null而不是false
發錶評論
零 減 捌 =
評論通過審核後顯示。