_MSC_VER должен быть определен к определенному номеру версии. Вы можете или #ifdef на нем, или можно использовать фактическое, определяют и делают тест во время выполнения. (Если по некоторым причинам Вы хотели выполнить различный код на основе того, с каким компилятором он был скомпилирован? Да, вероятно, Вы искали #ifdef.:))
Если у вас есть пустая папка в пустой папке внутри пустой папки, вам необходимо пройтись по ВСЕМ папкам трижды. Все это потому, что вы идете вширь - тестируйте папку ПЕРЕД тестированием ее дочерних элементов. Вместо этого вам следует перейти в дочерние папки перед проверкой, если родительский элемент пуст, в этом случае будет достаточно одного прохода.
function RemoveEmptySubFolders($path)
{
$empty=true;
foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file)
{
if (is_dir($file))
{
if (!RemoveEmptySubFolders($file)) $empty=false;
}
else
{
$empty=false;
}
}
if ($empty) rmdir($path);
return $empty;
}
Между прочим, glob не возвращает. и .. записи.
Укороченная версия:
function RemoveEmptySubFolders($path)
{
$empty=true;
foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file)
{
$empty &= is_dir($file) && RemoveEmptySubFolders($file);
}
return $empty && rmdir($path);
}
Эта строка
$ret = $ret ? $ret : $res;
Можно было бы сделать немного более читаемым:
$ret = $ret || $res;
Или, если PHP имеет побитовый оператор:
$ret |= $res;
Это может означать проблемы, потому что вызов RemoveEmptySubFolders
несколько раз, вероятно, приведет к ошибке, потому что каждый раз, когда вы вызываете функцию, другие две функции определены снова. Если они уже были определены, PHP выдаст ошибку о том, что функция с таким же именем уже определена.
Вместо этого попробуйте рекурсивно:
function removeEmptySubfolders($path){
if(substr($path,-1)!= DIRECTORY_SEPARATOR){
$path .= DIRECTORY_SEPARATOR;
}
$d2 = array('.','..');
$dirs = array_diff(glob($path.'*', GLOB_ONLYDIR),$d2);
foreach($dirs as $d){
removeEmptySubfolders($d);
}
if(count(array_diff(glob($path.'*'),$d2))===0){
rmdir($path);
}
}
Протестировано, работает нормально. Windows 7 PHP 5.3.0 XAMPP
Вы можете попробовать это.
function removeEmptySubfolders($path){
if(substr($path,-1)!= DIRECTORY_SEPARATOR){
$path .= DIRECTORY_SEPARATOR;
}
$d2 = array('.','..');
$dirs = array_diff(glob($path.'*', GLOB_ONLYDIR),$d2);
foreach($dirs as $d){
removeEmptySubfolders($d);
}
if(count(array_diff(glob($path.'*'),$d2))===0){
$checkEmpSubDir = explode(DIRECTORY_SEPARATOR,$path);
for($i=count($checkEmpSubDir)-1;$i>0;$i--){
$path = substr(str_replace($checkEmpSubDir[$i],"",$path),0,-1);
if(($files = @scandir($path)) && count($files) <= 2){
rmdir($path);
}
}
}
}