Удалить папку и все файлы на 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), чтобы продолжить.