## What — 3パーツの役割
1つのファイルのフルパスは3パーツに分かれる:
```
gs://example-bucket / tenant-a/Sales/ / 2026-06-01.csv
└─ bucket ───┘ └─ prefix ──┘ └─ ファイル名 ─┘
```
| パーツ | 役割 | どこから来る |
|--------|------|-------------|
| bucket | 一番外側の入れ物 | コードで別引数として渡す |
| prefix | バケット内の「どの引き出しを開けるか」 | 自分で組み立てる |
| ファイル名 | 引き出しの中身 | 一覧した結果として返ってくる |
重要なのは、Cloud Storage に本当は「フォルダ」が無いこと。prefix はオブジェクト名の前方一致フィルタにすぎない。`tenant-a/Sales/` は「この文字列で始まる名前のオブジェクトを全部ちょうだい」という意味になる。
> [!info]
> prefix の役割は「どの引き出しを開けるか」であって「中の何を取るか」ではない。中身(ファイル名)は開けた後の一覧で分かる。
## How — prefixの切り方
prefix は目的のファイル群が入っているフォルダ階層までを指定する。それ以上でも以下でもない。
- 細かくしすぎない:ファイル名(日付)まで入れると1ファイルしか取れない。「未取り込みの全CSV」が欲しいので、絞るのはフォルダまで。どれを実際に取るかは一覧した後に決める。
- ざっくりしすぎない:`tenant-a/` だけだと、将来 `tenant-a/Stock/` のような別データが混ざる。`source` まで付けて「テナント × データ種別」で1グループに切り出す。
```go
// bucket は別引数。prefix にバケット名は含めない
prefix := fmt.Sprintf("%s/%s/", tenant, source) // 例: tenant-a/Sales/
objects, _ := gcs.ListObjects(ctx, bucket, prefix)
```
> [!warning]
> 末尾の `/` が地味に効く。`tenant-a/Sales`(スラッシュ無し)は前方一致なので `tenant-a/Sales2024/` や `tenant-a/SalesBackup/` まで巻き込む。`/` を付けて「Sales 直下」に限定する。
## 関連
- [[Google Cloud]]
- [[Cloud StorageとBigQuery]]