Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP删除错误的目录_Php_Function_Web_Filesystems_Lamp - Fatal编程技术网

PHP删除错误的目录

PHP删除错误的目录,php,function,web,filesystems,lamp,Php,Function,Web,Filesystems,Lamp,我正在用PHP开发一个在线存储的原型,我遇到了这个问题。我从客户端调用delete\u file()函数,该函数检查要删除的项目是文件还是目录,并相应地删除它。如果该项是一个目录,那么它将调用另一个函数,该函数将删除其所有内容和目录本身 function delete_file (){ global $directory; $rec_data = trim($_POST['selected']); $selected_items = explode(";", $rec_d

我正在用PHP开发一个在线存储的原型,我遇到了这个问题。我从客户端调用
delete\u file()
函数,该函数检查要删除的项目是文件还是目录,并相应地删除它。如果该项是一个目录,那么它将调用另一个函数,该函数将删除其所有内容和目录本身

function delete_file (){
    global $directory;
    $rec_data = trim($_POST['selected']);
    $selected_items = explode(";", $rec_data);

    if (count($selected_items) < 1){
        echo "0";
    }
    else {
        foreach ($selected_items as $item){
            if (is_dir("{$directory}/{$item}")){
                recursiveRemoveDirectory("{$directory}/{$item}");
            }
            else {
                unlink("{$directory}/{$item}");
            }
        }
        echo "1";
    }
}

function recursiveRemoveDirectory($rm_directory){
    foreach(scandir($rm_directory) as $file){
        if($file != "." && $file != ".."){
            if(is_dir($file)) {
                recursiveRemoveDirectory($file);
            }
            else {
                unlink($file);
            }
        }
    }
    rmdir($rm_directory);
}
函数删除_文件(){
全球$目录;
$rec_data=trim($_POST['selected']);
$selected_items=分解(“;”,$rec_数据);
if(计数($selected_items)<1){
回声“0”;
}
否则{
foreach($选定的\u项作为$项){
if(is_dir(“{$directory}/{$item}”)){
RecursiveRemoteDirectory(“{$directory}/{$item}”);
}
否则{
取消链接(“{$directory}/{$item}”);
}
}
回声“1”;
}
}
函数recursiveremoveditory($rm\u目录){
foreach(scandir($rm_目录)作为$file){
如果($file!=“&&&$file!=”){
if(is_dir($file)){
RecursiveEmoveDirectory($file);
}
否则{
取消链接($文件);
}
}
}
rmdir($rm_目录);
}
问题:它可以工作,但也会删除父目录。例如数据>用户名>目录,如果我想删除目录,它也会删除用户名。我尝试过其他各种方法,但都没有成功

function recursiveRemoveDirectory($rm_directory){
    foreach(scandir($rm_directory) as $file){
        if($file != "." && $file != ".."){
            if(is_dir($file)) {                  <--- error starts here!
                recursiveRemoveDirectory($file);
            }
            else {
                unlink($file);                   <--- error ends here!
            }
        }
    }
    rmdir($rm_directory);
}
您在
delete\u file
函数中正确地实现了这一点,但在递归函数中没有实现这一点。

尝试以下操作:

function recursiveRemoveDirectory($dir) {
    foreach(scandir($dir) as $file) {
        if ('.' === $file || '..' === $file) continue;
        if (is_dir("$dir/$file")) recursiveRemoveDirectory("$dir/$file");
        else unlink("$dir/$file");
    }
    rmdir($dir);
}

我尝试了这两种答案,它们确实解决了我在代码中遇到的问题,但它没有解决我遇到的问题,即父目录和所选项目一起被删除

在查看和更改代码一段时间后,我终于意识到问题不在于
recursivedeleteditory()
函数,而在于
delete\u file()
函数本身

$selected\u items
变量获取要选择的项的名称的串联字符串,它修剪任何不必要的空白并从该字符串生成一个数组。问题是,$selected_items以某种方式获得了一个额外的空条目,这意味着我当时正在执行
recursiveemoveddirectory(“{$directory}/”
而不是
recursiveemovedirectory(“{$directory}/{$item}”)

我通过添加以下内容解决了所有问题:

if (empty($item)){
    continue;
}
下面是代码的外观:

function delete_file (){
    global $directory;
    $selected_items = explode(";", trim($_POST['selected']));

    if (count($selected_items) < 1){
        echo "0";
    }
    else {
        foreach ($selected_items as $item){
            if (empty($item)){
                continue;
            }
            if (is_dir("{$directory}/{$item}")){
                recursiveRemoveDirectory("{$directory}/{$item}");
            }
            else if (is_file("{$directory}/{$item}")){
                unlink("{$directory}/{$item}");
            }
        }
        echo "1";
    }

}

function recursiveRemoveDirectory($rm_directory){
    $files = file_explore();
    if(count($files) > 0){
        foreach($files as $file){
            if(is_dir("{$rm_directory}/{$file}")) {
                recursiveRemoveDirectory("{$rm_directory}/{$file}");
            }
            else if (is_file("{$rm_directory}/{$file}")) {
                unlink("{$rm_directory}/{$file}");
            }
        }
    }
    rmdir($rm_directory);
函数删除_文件(){
全球$目录;
$selected_items=explode(;),trim($_POST['selected']);
if(计数($selected_items)<1){
回声“0”;
}
否则{
foreach($选定的\u项作为$项){
如果(空($项)){
继续;
}
if(is_dir(“{$directory}/{$item}”)){
RecursiveRemoteDirectory(“{$directory}/{$item}”);
}
else if(是_文件(“{$directory}/{$item}”)){
取消链接(“{$directory}/{$item}”);
}
}
回声“1”;
}
}
函数recursiveremoveditory($rm\u目录){
$files=file_explore();
如果(计数($files)>0){
foreach($files作为$file){
if(is_dir(“{$rm_directory}/{$file}”)){
RecursiveRemoteDirectory(“{$rm_目录}/{$file}”);
}
else if(is_file(“{$rm_directory}/{$file}”)){
取消链接(“{$rm_目录}/{$file}”);
}
}
}
rmdir($rm_目录);
现在我的问题,不是真正的堆栈溢出问题,是php函数的命名转换,我从来没有在函数名上使用下划线,但最近它已经改变了,我觉得这是一个坏习惯,如果有人想对此发表评论,你可以随意这样做,我真的想知道在php中必须如何做


干杯!

我尝试了你的建议,但它仍然删除了父目录。这有点猜测,因为我们不知道删除_文件的初始输入。在每次调用
取消链接
rmdir
递归emoveddirectory
之前都放一些echo语句,比如
echo“在删除\u文件中取消$directory/$item的链接
\n”
echo“从RecursiveRemoteDirectory调用RecursiveDirectory($rm\u directory/$file)
\n“
。这应该可以帮助您了解发生了什么。谢谢,我正在打电话,所以一到电话我就去做。正如您所知,一切工作的方式是客户端通过ajax调用php文件,同时传递要执行的操作(创建文件夹、删除等)以及相关数据,如要删除的项目或要创建的新文件夹的名称;在php文件中,我获得了每个操作的函数,然后根据$u POST中通过案例陈述所述的操作调用这些函数。一些操作然后根据操作结果发送反馈。我也支持您的建议,但仍然删除了pa因为某种原因租了这个目录。
function delete_file (){
    global $directory;
    $selected_items = explode(";", trim($_POST['selected']));

    if (count($selected_items) < 1){
        echo "0";
    }
    else {
        foreach ($selected_items as $item){
            if (empty($item)){
                continue;
            }
            if (is_dir("{$directory}/{$item}")){
                recursiveRemoveDirectory("{$directory}/{$item}");
            }
            else if (is_file("{$directory}/{$item}")){
                unlink("{$directory}/{$item}");
            }
        }
        echo "1";
    }

}

function recursiveRemoveDirectory($rm_directory){
    $files = file_explore();
    if(count($files) > 0){
        foreach($files as $file){
            if(is_dir("{$rm_directory}/{$file}")) {
                recursiveRemoveDirectory("{$rm_directory}/{$file}");
            }
            else if (is_file("{$rm_directory}/{$file}")) {
                unlink("{$rm_directory}/{$file}");
            }
        }
    }
    rmdir($rm_directory);