首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Google Storage REST api删除包含文件的文件夹?

如何使用Google Storage REST api删除包含文件的文件夹?
EN

Stack Overflow用户
提问于 2011-04-12 11:29:56
回答 2查看 2.1K关注 0票数 3

我正在尝试使用他们的REST api从Google Storage中删除_$folder$。到目前为止,我已经尝试了headerserver.com/testestset/*headerserver.com/testestsetheaderserver.com/testestset_$folder$,但当文件夹中有任何文件时,似乎都不起作用。

到目前为止,我想出的唯一方法是在尝试删除_$folder$下的所有对象之前对其执行foreach操作,然而,这是非常低效的。

在最坏的情况下:是否可以对每个请求批处理/删除多个文件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-22 06:43:10

不幸的是,除了删除目录或_$folder$对象中的所有对象之外,没有其他方法。

票数 0
EN

Stack Overflow用户

发布于 2015-01-20 05:15:35

已经4年了,但他们仍然没有给出一个合适的API。

对于仍然需要解决问题的人,这里有一个选择。

此示例用于删除父文件夹、其嵌套文件夹及其所有内容

代码语言:javascript
运行
复制
<?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;
    }

}

这是它在数据库中的记录方式,用来解释递归过程。

如果您想知道为什么_empty-folder_s在file_removedirectory_remove的日志中出现了两次,这个$objects = $this->driver->objects->listObjects($this->bucket, $c);部件将文件夹的名称列回到$files = $objects->getItems();中。

可能是因为它不是一个物理文件夹,而是一个表示为文件夹的空文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5630093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档