Delete folder and all files on FTP connection
Solution 1
Ok found my problem. Since I wasn't moving into the exact directory I was trying to delete, the path for each recursive file being called wasn't absolute:
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);
};
Solution 2
I took some time to write my own version of a recursive delete function over ftp, this one should be fully functional (I tested it myself).
Try it out and modify it to fit your needs, if it's still not working there are other problems. Have you checked the permissions on the files you are trying to delete?
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);
}
}
Solution 3
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);
}
}
![JimmyJammed](https://i.stack.imgur.com/SCrvB.png?s=256&g=1)
JimmyJammed
Software Engineer Experienced In: iOS / Objective-C / Swift PHP Javascript / jQuery mySQL / SQL HTML / CSS Graphic Design
Updated on June 18, 2022Comments
-
JimmyJammed about 2 years
Trying to add the ability to delete a Folder using FTP and all subfolders and files contained within that folder.
I have built a recursive function to do so, and I feel like the logic is right, but still doesnt work.
I did some testing, I am able to delete on first run if the path is just an empty folder or just a file, but can't delete if it is a folder containing one file or a folder containing one empty subfolder. So it seems to be a problem with traversing through the folder(s) and using the function to delete.
Any ideas?
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); } };
-
JimmyJammed over 12 yearsThis was the thought I just had as well. However this still doesnt work. I did some testing, so I am able to delete on first run if the path is just an empty folder or just a file, but can't delete if it is a folder containing one file or a folder containing one empty subfolder. Stumped
-
vladkras over 7 yearsyep, this works. I use it with relative path, but absolute should work too
-
Mostafa over 6 yearsHow create ftp connection handle? are this corrent:
$conn_id = ftp_connect($ftp_server); $handle = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
-
Akira Yamamoto about 6 yearsThe following solution worked better for me: stackoverflow.com/a/4069590/475876 - this answer is missing
ftp_chdir