2011-04-12 44 views
1

我試圖使用REST API從Google Storage中刪除_$folder$。我已嘗試到目前爲止headerserver.com/testestset/*,headerserver.com/testestset,headerserver.com/testestset_$folder$,但在文件夾中有任何文件時都不起作用。如何使用Google Storage REST API刪除文件夾中的文件?

我想出了迄今爲止唯一的辦法是foreach_$folder$所有對象試圖刪除它之前,然而,這是非常低效的。

在最糟糕的情況下:是否可以批量/刪除每個請求的多個文件?

回答

0

不幸的是,除了使用目錄或_$folder$對象刪除所有對象外,沒有別的辦法。

0

已經4年了,他們仍然沒有給出適當的API。

對於你仍然需要解決的問題,這裏有一個選項。

這個例子是消除父文件夾,其嵌套文件夾,和他們所有的內容

<?php 

/** 
* Delete nested folders for Google Cloud Storage 
*/ 

class ClassName { 

    /** @var Google_Service_Storage $storageService */ 
    public $storageService; 

    /** @var string $bucket */ 
    public $bucket = ''; 

    /** 
    * Remove an object 
    * 
    * @param string $objectPath 
    * @return boolean 
    */ 
    public function removeObject($objectPath) { 
     // validator 
     try { 
      if (!$this->storageService->objects->get($this->bucket, $objectPath)) { 
       // log error 
       return false; 
      } 
     } catch (Exception $ex) { 
      // leave this empty 
     } 

     // remove action 
     try { 
      $this->storageService->objects->delete($this->bucket, $objectPath); 
     } catch (Exception $ex) { 
      // log error 
      return false; 
     } 
     // log success 

     return true; 
    } 

    /** 
    * Remove the specified container 
    * 
    * @param string $path 
    * @return boolean 
    */ 
    public function removeContainer($path) { 
     $c = array(); 
     $c['delimiter'] = '/'; 
     if (!empty($path) && $path != '/') { 
      $c['prefix'] = $path; 
     } 
     $objects = null; 

     // validator 
     try { 
      $objects = $this->storageService->objects->listObjects($this->bucket, $c); 
      if (empty($objects)) { 
       if (!$this->storageService->objects->get($this->bucket, $path)) { 
        // log error 
        return false; 
       } 
      } 
     } catch (Exception $ex) { 
      // leave this empty 
     } 

     // remove action 
     try { 
      if (empty($objects)) { 
       $this->storageService->objects->delete($this->bucket, $path); 
      } else { 
       /** 
       * Process files first 
       */ 
       $files = $objects->getItems(); 
       if (!empty($files)) { 
        foreach ($files as $file) { 
         $this->removeObject($file->getName()); 
        } 
       } 
       /** 
       * And folders later 
       */ 
       $folders = $objects->getPrefixes(); 
       if (!empty($folders)) { 
        foreach ($folders as $folder) { 
         $this->removeContainer($folder); 
        } 
       } 
      } 
     } catch (Exception $ex) { 
      // log error 
      return false; 
     } 
     // log success 

     return true; 
    } 

} 

這是它是如何記錄在數據庫中,解釋了遞歸過程。

recursive folders delete

如果你是好奇,爲什麼空文件夾 S上的日誌中走了出來兩次file_removedirectory_remove,這$objects = $this->driver->objects->listObjects($this->bucket, $c);部分中列出的文件夾的名稱回$files = $objects->getItems();

可能是因爲它是不是物理文件夾,而是表示爲文件夾的空文件。

相關問題