模拟的文件夹

本页面简要介绍了 Cloud Storage 中的文件夹。

文件夹概览

除了代管式文件夹之外,Cloud Storage 使用平面命名空间运行,这意味着文件夹实际上不存在于 Cloud Storage 中。如果您在存储桶 your-bucket 中创建名为 folder1/file.txt 的对象,则该对象的路径为 your-bucket/folder1/file.txt,但不存在名为 folder1 的文件夹;字符串 folder1 是对象名称的一部分。

但是,Google Cloud 控制台和 Cloud Storage CLI 可以提供分层文件树的幻觉:

  • Google Cloud 控制台会以类似于本地文件浏览器的文件夹创建可视化的表示形式。

  • Cloud Storage CLI 使用各种规则模拟典型的命令行目录体验。

/storage/images/folders.svg

工具

点击下面的标签,了解各个工具如何处理文件夹。

控制台

在 Google Cloud 控制台中,您可以在存储桶中创建一个空文件夹,也可以上传现有文件夹。

当您上传现有文件夹时,该文件夹的名称将成为文件夹中所有对象的路径的一部分。所有子文件夹及其包含的对象也会包含在上传内容中。

要创建文件夹,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 导航到存储桶。

  3. 点击创建文件夹以创建空的新文件夹,或点击上传文件夹来上传现有文件夹。

命令行

为了实现错开分层文件树的视觉效果,gcloud storagegsutil 命令会应用以下规则来确定应将命令中的目标网址视为对象名称还是文件夹:

  1. 如果目标网址以 / 字符结尾,则 CLI 命令会将目标网址视为文件夹。例如,假设存在以下命令,其中 your-file 是文件的名称:

    gcloud storage cp your-file gs://your-bucket/abc/

    完成此命令后,Cloud Storage 会在存储桶 your-bucket 中创建一个名为 abc/your-file 的对象。

  2. 如果您将多个源文件复制到目标网址,则 CLI 会将目标网址视为文件夹。例如,假设存在以下命令,其中 your-dir 是包含 file1file2 等文件的文件夹:

    gcloud storage cp your-dir gs://your-bucket/abc --recursive

    完成此命令后,Cloud Storage 会在存储桶 your-bucket 中创建对象 abc/your-dir/file1abc/your-dir/file2

  3. 如果上述规则均不适用,CLI 会检查存储桶中的对象,以确定目标网址是对象名称还是文件夹。例如,假设存在以下命令,其中 your-file 是文件的名称:

    gcloud storage cp your-file gs://your-bucket/abc

    CLI 会使用 / 分隔符和前缀=abc 针对 your-bucket 发出对象列出请求,以确定 your-bucket 中是否有路径以 abc/ 开头的对象。如果有,CLI 会将 abc/ 视为文件夹名称,并且上述命令会在存储桶 your-bucket 中创建对象 abc/your-file。否则,CLI 会在 your-bucket 中创建对象 abc

这种基于规则的方法与许多工具的工作方式不同,后者会创建 0 字节对象来标记文件夹的存在。Cloud Storage CLI 可以理解此类工具采用的多种惯例(例如将 _$folder$ 添加到 0 字节对象名称末尾的惯例),但不要求此类标记对象实现与 UNIX 命令一致的命名行为。

重试和命名

当 Cloud Storage CLI 重试中断的请求时,您可能会遇到以下问题:第一次尝试复制文件子集,而后续尝试遇到已存在的目标文件夹,这会导致对象命名不正确。

例如,假设存在以下命令,其中 your-dir/ 下存在子文件夹(如 dir1dir2),这两个子文件夹都包含文件 abc

gcloud storage cp ./your-dir gs://your-bucket/new --recursive

如果路径 gs://your-bucket/new 尚不存在,则 CLI 会在第一次尝试成功时创建以下对象:

new/dir1/abc
new/dir2/abc

但是,下次成功尝试同一命令时,CLI 会创建以下对象:

new/your-dir/dir1/abc
new/your-dir/dir2/abc

如需让 CLI 在每次尝试时保持一致性,请尝试以下操作:

  1. 在目标网址的末尾添加斜杠,以便 CLI 始终将其视为文件夹。

  2. 请使用 gcloud storage rsyncgsutil rsync。由于 rsync 不使用 Unix cp 定义的文件夹命名规则,因此无论目标子文件夹是否存在,它都会以一致的方式运行。

如需详细了解如何构建名称,请参阅使用 cp 构建名称

补充说明

  • 您无法使用 Cloud Storage CLI 创建零字节对象来模拟空文件夹。

  • 如果您使用脚本通过组合子路径来构建文件路径,请注意,由于 / 只是位于对象名称中的字符,因此 CLI 将 gs://my-bucket/folder/ 解释为与 gs://my-bucket//folder 不同的对象。

REST API

JSON API

JSON API 中不存在文件夹。如需缩小列出的对象的范围,您可以使用 prefixdelimiter 查询参数

例如,如需列出存储桶 my-bucket 中前缀为 folder/subfolder/ 的所有对象,请使用以下网址发出对象列出请求:

"https://storage.googleapis.com/storage/v1/b/my-bucket/o?prefix=folder/subfolder/"

XML API

XML API 中不存在文件夹,但您可以使用prefixdelimiter查询参数缩小搜索范围列出的对象

例如,如需列出存储桶 my-bucket 中前缀为 folder/subfolder/ 的所有对象,请使用以下网址发出对象列出请求:

"https://storage.googleapis.com/my-bucket?prefix=folder/subfolder/"

后续步骤