как проверить в цикле для папки или файла в php - PullRequest
0 голосов
/ 13 января 2019

Для копирования папки и файла в php я использую этот цикл:

if(is_dir($_POST['copyfile'])) {
    $copyfolder = recurse_copy($src_folder,$dest_folder);
    if( $copyfolder) {
    echo 'succeed-folder';
    exit;
    }
    else {
        echo 'failed-folder';

    exit;
    }
}
else {
    $copy = copy( $src_file_url, $dest_file );
    if($copy) {
    echo 'succeed-file';
    exit;
    }
    else {
        echo 'failed-file';

    exit;
    }
}

При копировании папки вместо файла я проверяю это с помощью: if(is_dir($_POST['copyfile']))

В случае, если это действительно папка, она правильно копирует файлы в папке, но выдает мне эхо: failed-folder

Так что должно быть что-то не так с циклом. Что не так с петлей? Я только хочу различить, если folder или file был скопирован с эхом

Это функция:

function recurse_copy($src_folder,$dest_folder ) {
    $copydir = opendir($src_folder);

    while(false !== ( $folder = readdir($copydir)) ) {
        if (( $folder != '.' ) && ( $folder != '..' )) {
            if ( is_dir($src_folder . '/' . $folder) ) {
                recurse_copy($src_folder. '/' . $folder,$dest_folder . '/' . $folder);
            }
            else {
                copy($src_folder. '/' . $folder , $dest_folder . '/' . $folder);
            }
        }
    }
    closedir($copydir);
}

Ответы [ 2 ]

0 голосов
/ 13 января 2019

У вас нет return заявления вообще. Поэтому функция возвращает void, который оценивается как false. Вам необходимо вернуть значение bool, указывающее, произошла ли ошибка.

Эта версия не останавливает процесс копирования, она просто отслеживает, все ли операции были успешными:

function recurse_copy($src_folder,$dest_folder ) {
  $success = true;
  $copydir = opendir($src_folder);
  if(!$copydir)
    return false;

  while(false !== ( $folder = readdir($copydir)) ) {
    if (( $folder != '.' ) && ( $folder != '..' )) {
      if ( is_dir($src_folder . '/' . $folder) ) {
        $success = recurse_copy($src_folder. '/' . $folder,$dest_folder . '/' . $folder) && $success;
      }
      else {
        $success = copy($src_folder. '/' . $folder , $dest_folder . '/' . $folder) && $success;
      }
    }
  }
  closedir($copydir);

  return $success;
}
0 голосов
/ 13 января 2019

Примером того, как вы можете изменить функцию recurse_copy(), является проверка каждой точки, которая может быть проблемой - opendir(), mkdir() и copy(), и они возвращают значение false, если какой-либо шаг завершился неудачей. Таким образом, это значение проверяется, чтобы остановить цикл при сбое, а затем возвращается в конце ...

function recurse_copy($src,$dst) {
    $dir = opendir($src);
    // As long as opendir is OK, then mkdir, or set failure
    $success = ($dir)?mkdir($dst):false;
    while($success && (false !== ( $file = readdir($dir))) ) {
        if (( $file != '.' ) && ( $file != '..' )) {
            if ( is_dir($src . '/' . $file) ) {
                $success = recurse_copy($src . '/' . $file,$dst . '/' . $file);
            }
            else {
                $success = copy($src . '/' . $file,$dst . '/' . $file);
            }
        }
    }
    if ( $dir )    {
        closedir($dir);
    }

    return $success;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...