2011-04-12 8 views
1

Google StorageからREST APIを使用して_$folder$を削除しようとしています。私はこれまでに試してみましたheaderserver.com/testestset/*headerserver.com/testestsetheaderserver.com/testestset_$folder$いずれかのファイルがフォルダ内にある場合は動作していないようです。Google Storage REST APIを使用してファイルが保存されているフォルダを削除するにはどうすればよいですか?

私がこれまでに考え出した唯一のアプローチは、foreachのすべてのオブジェクトを削除しようとする前に_$folder$の下にありますが、これは非常に非効率的です。

最悪のシナリオ:リクエスト1回につき複数のファイルをバッチ/削除することは可能ですか?

答えて

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();にフォルダの名前を記載されている興味があれば、それはだから、

であってもよいです物理的なフォルダではなく、フォルダとして表す空のファイルです。

関連する問題