Удалить папку и все файлы на FTP-соединении

Попытка добавить возможность удаления папки с использованием FTP и всех подпапок и файлов, содержащихся в этой папке.

Я построил рекурсивную функцию для этого, и я чувствую, что логика верна, но все еще не работает.

Я провел некоторое тестирование, я могу удалить при первом запуске, если путь - это просто пустая папка или просто файл, но не могу удалить, если это папка, содержащая один файл, или папка, содержащая одну пустую подпапку. Таким образом, кажется, что проблема с перемещением по папкам и использованию функции удаления.

Есть идеи?

function ftpDelete($directory)
{
    if(empty($directory))//Validate that a directory was sent, otherwise will delete ALL files/folders
        return json_encode(false);
    else{
        global $conn_id;
        # here we attempt to delete the file/directory
        if( !(@ftp_rmdir($conn_id,$directory) || @ftp_delete($conn_id,$directory)) )
        {
            # if the attempt to delete fails, get the file listing
            $filelist = @ftp_nlist($conn_id, $directory);

            # loop through the file list and recursively delete the FILE in the list
            foreach($filelist as $file)
                ftpDelete($file);

            #if the file list is empty, delete the DIRECTORY we passed
            ftpDelete($directory);
        }
        else
            return json_encode(true);
    }
};

4 ответа

Решение

Хорошо, нашел мою проблему. Поскольку я не перемещался в точный каталог, который пытался удалить, путь для каждого вызываемого рекурсивного файла не был абсолютным:

function ftpDeleteDirectory($directory)
{
    global $conn_id;
    if(empty($directory))//Validate that a directory was sent, otherwise will delete ALL files/folders
        return json_encode(false);
    else{
        # here we attempt to delete the file/directory
        if( !(@ftp_rmdir($conn_id,$directory) || @ftp_delete($conn_id,$directory)) )
        {
            # if the attempt to delete fails, get the file listing
            $filelist = @ftp_nlist($conn_id, $directory);
            # loop through the file list and recursively delete the FILE in the list
            foreach($filelist as $file)
            {
            //  return json_encode($filelist);
                ftpDeleteDirectory($directory.'/'.$file);/***THIS IS WHERE I MUST RESEND ABSOLUTE PATH TO FILE***/
            }

            #if the file list is empty, delete the DIRECTORY we passed
            ftpDeleteDirectory($directory);
        }
    }
    return json_encode(true);
};

Мне потребовалось некоторое время, чтобы написать свою собственную версию рекурсивной функции удаления через ftp, эта должна быть полностью функциональной (я сам ее протестировал).

Попробуйте и измените его в соответствии с вашими потребностями, если он все еще не работает, есть другие проблемы. Вы проверили права доступа к файлам, которые пытаетесь удалить?

function ftp_rdel ($handle, $path) {

  if (@ftp_delete ($handle, $path) === false) {

    if ($children = @ftp_nlist ($handle, $path)) {
      foreach ($children as $p)
        ftp_rdel ($handle,  $p);
    }

    @ftp_rmdir ($handle, $path);
  }
}
function recursiveDelete($handle, $directory)
{   echo $handle;
    # here we attempt to delete the file/directory
    if( !(@ftp_rmdir($handle, $directory) || @ftp_delete($handle, $directory)) )
    {            
        # if the attempt to delete fails, get the file listing
        $filelist = @ftp_nlist($handle, $directory);
        // var_dump($filelist);exit;
        # loop through the file list and recursively delete the FILE in the list
        foreach($filelist as $file) {            
            recursiveDelete($handle, $file);            
        }
        recursiveDelete($handle, $directory);
    }
}

Вы должны проверить (используя ftp_chdir) для каждого "файла", который вы получаете от ftp_nlist чтобы проверить, является ли это каталогом:

foreach($filelist as $file)
{
    $inDir = @ftp_chdir($conn_id, $file);

    ftpDelete($file)

    if ($inDir) @ftp_cdup($conn_id);
}

Этот простой трюк будет работать, потому что если ftp_chdir работает, ток $file на самом деле папка, и вы переехали в нее. Затем вы вызываете ftpDelete рекурсивно, чтобы позволить ему удалить файлы в этой папке. После этого вы двигаетесь назад (ftp_cdup), чтобы продолжить.

Другие вопросы по тегам