【问题标题】:Recursively deleting a folder in Google Cloud Storage递归删除 Google Cloud Storage 中的文件夹
【发布时间】:2016-06-09 21:47:35
【问题描述】:

我有以下代码应该删除目录和其中的所有内容。

它似乎工作正常,但由于某种原因,当代码运行时,我在我的应用引擎日志中收到以下警告

有谁知道为什么会发生这种情况,或者是否有更好的方法来避免这些错误?

PHP 警告:云存储错误:第 223 行 /base/data/home/runtimes/php/sdk/google/appengine/ext/cloud_storage_streams/CloudStorageDirectoryClient.php 中未找到

function deleteDir($dirPath) 
{
    if (! is_dir($dirPath)) {
        die("not a directory");
    }
    if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
        $dirPath .= '/';
    }
    $files = glob($dirPath . '*', GLOB_MARK);
    foreach ($files as $file) {
        if (is_dir($file)) {
            deleteDir($file);
        } else {
            unlink($file);
        }
    }
    rmdir($dirPath);
}

deleteDir("gs://folder/folder");

【问题讨论】:

    标签: php google-app-engine google-cloud-storage


    【解决方案1】:

    GCS doesn't actually have (sub)directories,它们是通过从类似路径的文件名段中提取它们来“伪造”的:

    gsutil 提供了分层文件树的错觉 Google Cloud Storage 服务支持的“平面”名称空间。到 服务,对象 gs://your-bucket/abc/def/ghi.txt 只是一个 名称中恰好有“/”字符的对象。没有 “abc”或“abc/def”目录;仅具有给定的单个对象 名字。

    所以您实际上并不需要 rmdir($dirPath); 语句(我怀疑这是导致警告的原因)。

    【讨论】:

    • 感谢您的信息!那工作得很好。很奇怪,它让我在控制台中创建了一个假文件夹,里面没有任何内容 - 但是,当我删除此语句时,它最终会完全删除该文件夹。
    • 这就是分层结构仿真的工作原理。 “目录创建”只是一个无操作(除非您还在其中创建文件,否则在“创建”之后您实际上不会找到它)。即使 创建其父目录,您也应该能够创建该文件。 “目录删除”的发生是因为为目录中的每个 $file 调用了 unlink($file);deleteDir($file); 语句 - 一旦删除所有内容,目录本身就会自动消失(没有剩余的文件,其目录名称位于其开头文件名,无法“伪造”目录的存在)
    • 在控制台中创建文件夹时,会创建一个带有文件夹名称的零字节对象。因此,例如,如果您在名为 test 的文件夹中创建名为 blah 的文件夹,则零字节对象将命名为 gs://bucket/test/blah/(包括斜杠)。注意:这个对象只会在通过控制台创建文件夹时创建。需要显示该文件夹,以便用户可以导航到该文件夹​​。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多