PHP删除错误的目录
我正在用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
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);