Удалить папку и все файлы на FTP-соединении - PullRequest
4 голосов
/ 15 декабря 2011

Попытка добавить возможность удаления папки с использованием 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 ]

5 голосов
/ 15 декабря 2011

Мне потребовалось некоторое время, чтобы написать свою собственную версию рекурсивной функции удаления через 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);
  }
}
1 голос
/ 11 апреля 2013
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);
    }
}
1 голос
/ 21 декабря 2011

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

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);
};
0 голосов
/ 15 декабря 2011

Вы должны проверить (используя 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), чтобы продолжить.

...