当前位置: 首页 > 知识库问答 >
问题:

从给定路径删除文件和文件夹

屈健柏
2023-03-14

我有一个名为images的文件夹,位于用户的文件夹中,如:

图像

  • 用户1

当我从数据库中删除一个用户时,我还想删除该用户的所有文件和文件夹。所有这些都在一个包含函数的类中,但是当我执行函数时,我的整个文件夹图像都会被删除。。。

我已经检查了是否选择了正确的用户,路径是否正确。当我在测试的时候。php文件它工作得很好,但在我的函数中它被破坏了。

如果单击“删除”按钮,则转到此功能:

$user = new user();

$id = $_db->mysqli->real_escape_string($_POST['id']);

$query = "SELECT * FROM users WHERE id = '" .$id."'";
$result = $_db->mysqli->query($query);

$userNumb = $result->num_rows;
$finalUserNumb = $userNumb;

if ($finalUserNumb > 0) {
  $user->deleteUser($id);
}

通过给定的id获取用户信息

public function userSelsectByID($selector, $id)
{
    $query = "SELECT " .$selector. " FROM users WHERE id ='" .$id."'";
    $result = $this->mysqli->query($query);
    $userInfo = $result->fetch_assoc();

    $itemResult = $userInfo[$selector];
    return $itemResult;
  }

删除文件功能

public function delete_files($target)
{
      if(is_dir($target)){
          $files = glob( $target . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned

          foreach( $files as $file ){
              $this->delete_files( $file );
              echo "Deleted ".$file." succesfull...</br>";
          }

          rmdir( $target );
      } elseif(is_file($target)) {
          unlink( $target );
      }
  }

删除用户功能

public function deleteUser($id)
{
    $user               = "DELETE FROM users WHERE id = '$id'";
    $userResult         = $this->mysqli->query($user);

    $uren               = "DELETE FROM uren WHERE user_id = '$id'";
    $urenResult         = $this->mysqli->query($uren);

    $cookieLogin        = "DELETE FROM cookieLogin WHERE user_id = '$id'";
    $cookieLoginResult  = $this->mysqli->query($cookieLogin);

    $gebruikersnaam = str_replace(' ', '_', $this->userSelsectByID('gebruikersnaam', $id));
    $this->delete_files('/sites/domain.nl/www/admin/images/'.$gebruikersnaam);
  }

我想删除带有用户名的文件夹,但实际上整个图像文件夹都被删除了。。。我试了很多,但都不管用:(

能帮我的人?

共有2个答案

墨翔宇
2023-03-14

我想你错过了星星前的一个斜线

$files = glob( $target . '/*');

让我们做一些分析

  1. 用户名为“test”
  2. 您可以调用$this-

这可能出错的唯一方法是如果您的用户名是一个空字符串。

邢卓
2023-03-14

deleteUser功能中,您可以在从数据库中选择用户用户名之前删除该用户。

我怀疑这会导致出现这种情况-

您需要调整操作顺序,以确保在将用户名从数据库中删除之前检索到该用户名,以及在将其传递给$this之前确保用户名和用户目录存在-

public function deleteUser($id)
{
    $gebruikersnaam = str_replace(' ', '_', $this->userSelsectByID('gebruikersnaam', $id));
    $userImagesPath = '/sites/domain.nl/www/admin/images/'.$gebruikersnaam;

    $user               = "DELETE FROM users WHERE id = '$id'";
    $userResult         = $this->mysqli->query($user);

    $uren               = "DELETE FROM uren WHERE user_id = '$id'";
    $urenResult         = $this->mysqli->query($uren);

    $cookieLogin        = "DELETE FROM cookieLogin WHERE user_id = '$id'";
    $cookieLoginResult  = $this->mysqli->query($cookieLogin);

    if (!empty($gebruikersnaam) && is_dir($userImagesPath)) {
        $this->delete_files($userImagesPath);
    }
  }

作为在函数中递归使用glob的替代方法。我建议改为使用递归DirectoryIterator。

这将允许您按删除顺序检索所有文件和目录的列表:

给定一个

/home/fyrye/test/images
   - user1
       - 2018-12
           - image1.jpg
           - image2.jpg
       - 2019-01
           - image1.jpg
           - image2.jpg
   - user2
       - 2019-01
           - image1.jpg
           - image2.jpg
       - 2018-12
           - image1.jpg
           - image2.jpg

然后删除user1目录及其内部的所有内容。

$directory = '/home/fyrye/test/images/user1';

$ri = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS | FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO),
    RecursiveIteratorIterator::CHILD_FIRST
);
/**
 * @var string $path
 * @var \SplFileInfo $splFileInfo
 */
foreach ($ri as $path => $splFileInfo) {
    if ($splFileInfo->isDir()) {
        rmdir($path);
        echo 'deleted directory: ' . $path;
    } elseif ($splFileInfo->isFile()) {
        unlink($path);
        echo 'deleted file: ' . $path;
    }
}
rmdir($directory);
echo 'deleted directory: ' $directory;

结果:

deleted file: /home/fyrye/test/images/user1/2018-12/image1.jpg
deleted file: /home/fyrye/test/images/user1/2018-12/image2.jpg
deleted directory: /home/fyrye/test/images/user1/2018-12
deleted file: /home/fyrye/test/images/user1/2019-01/image1.jpg
deleted file: /home/fyrye/test/images/user1/2019-01/image2.jpg
deleted directory: /home/fyrye/test/images/user1/2019-01
deleted directory: /home/fyrye/test/images/user1

 类似资料:
  • 我有一个包含一些文件路径的长文本。 我想做的是从其中删除路径。文件路径都类似于: 我知道使用“^/all”将选择以/all开头的句子,并选择以.js$结尾的句子。但我无法将这些合并在一起以选择整个文件路径。 毕竟,正则表达式应该放在下面的代码上以删除路径。 我能为它写正则表达式吗?有什么工具吗?

  • 嗨,伙计们,所以我写了一个程序在C++它可以我开始调试参数通过cmd。例如: example.exe filepathoftxtfile 程序打开并读取txt文件。这一切都很正常,但如果txt文件位于包含空格的路径中,例如c:/users/jhon/test4/space4,则由于空格键的原因,程序将其检测为不止一个参数。有没有什么方法可以在调试参数中加入参数,而忽略单个参数的空格?另一件事是,我

  • 问题内容: 我正在从网上下载一个zip文件。它包含文件夹和文件。使用解压缩他们和。将文件名指定为。 所以我正在创造新的 但问题是它引发了异常:。我知道它正在创建子文件夹和。 我的问题是:如何通过路径上方创建包含子目录的文件? 问题答案: 用这个: 尽管您可以不检查结果而做,但是检查操作的返回值被认为是最佳实践。因此,首先检查现有目录,然后检查是否成功创建(如果尚不存在)。 参考: File.get

  • 问题内容: 我想从创建的可执行文件中 删除 所有路径信息。 我正在编译这样的代码: 上面的go build命令中的示例程序集的一部分: 注意:不建议使用:,如果您将其推荐为解决方案,则可能导致可执行文件损坏。 问题答案: 使用-trimpath标志删除路径信息: 更多信息: 传递给并将从elf二进制文件中删除所有路径信息。 您可以使用以下方法检查结果: 尽管有人说它已经修复,但在go社区中使用工具

  • 本文向大家介绍php删除一个路径下的所有文件夹和文件的方法,包括了php删除一个路径下的所有文件夹和文件的方法的使用技巧和注意事项,需要的朋友参考一下 php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用。 也适合在thinkphp中清理缓存,在thinkphp中可以把下面代码写入./Application/A

  • 问题内容: 我只想从完整路径到文件获取文件夹路径。 例如,我想要得到(不包括)。 我已经尝试过这样的事情: 但是它给了我这样的结果: 这不是我需要的结果(为)。 关于如何获取文件路径的任何想法? 问题答案: 您几乎可以使用该功能了。您只需要加入字符串,如下所示。 虽然,我建议使用该函数来执行此操作,但是您只需要传递字符串即可,它将为您完成工作。由于您似乎在Windows上,因此也考虑使用该功能。一