簡體   English   中英

從給定路徑刪除文件和文件夾

[英]Deleting files and folder from given path

我在像這樣的用戶文件夾中有一個名為images的文件夾:

圖片

  • 用戶1
  • 用戶2
  • 等等..

當我從數據庫中刪除用戶時,我還要刪除該給定用戶的所有文件和文件夾。 所有這些都在具有函數的類中,但是當我執行函數時,我的整個文件夾圖像都會被刪除...

我已經檢查了是否選擇了正確的用戶,路徑是否正確。 雖然我在test.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);
  }

我想刪除帶有用戶名的文件夾,但實際上整個圖像文件夾都被刪除了……我已經嘗試了很多,但沒有任何效果:(

有人可以幫助我嗎?

我想你在星星前錯過了一個斜線

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

UPDATE

讓我們做一些分析。

  1. 用戶名是“ test”
  2. 您調用$this->delete_files('/sites/domain.nl/www/admin/images/test');
  3. 目標是目錄-因此您需要使用glob('/sites/domain.nl/www/admin/images/test/*')
  4. Glob返回一個空數組-因此您不會刪除任何文件
  5. 然后制作rmdir('/sites/domain.nl/www/admin/images/test'); 並退出功能

唯一可能出錯的方法是,如果您的用戶名是一個空字符串。

deleteUser函數中,先刪除用戶,然后再從數據庫中選擇用戶名。

我懷疑這會導致this->userSelsectByID()返回null ,從而導致將'/sites/domain.nl/www/admin/images/'傳遞給$this->delete_files()

您需要調整操作順序,以確保在將用戶名從數據庫中刪除之前已檢索到用戶名,並確保在將用戶名和用戶目錄傳遞到$this->delete_files()之前,該用戶名和用戶目錄存在。

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的替代方法。 我建議改用RecursiveDirectoryIterator

這樣一來,您就可以按照刪除順序檢索所有文件和目錄的列表:

給定一個目錄結構

/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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM