Intereting Posts

Удалить папку и все файлы по 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); } }; 

    Я потратил некоторое время, чтобы написать собственную версию функции рекурсивного удаления над 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 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); }; 
     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) для продолжения.