OSS中檔案數量龐大時,所有檔案平鋪儲存會導致尋找困難、大量操作複雜。為瞭解決這些問題,OSS提供了目錄功能,通過類比檔案夾的結構來組織和管理海量對象。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見地區和Endpoint。
本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證(Go SDK V1)。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見配置用戶端(Go SDK V1)。
範例程式碼
建立目錄
以下代碼用於建立目錄。
package main
import (
"bytes"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫儲存空間名稱,例如examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 填寫目錄名稱,目錄需以正斜線結尾。
dirName := "exampledir/"
err = bucket.PutObject(dirName, bytes.NewReader([]byte("")))
if err != nil {
log.Fatalf("Failed to create directory '%s': %v", dirName, err)
}
log.Printf("Directory '%s' created successfully", dirName)
}
刪除目錄
警告
刪除目錄會同步刪除目錄下包含的子目錄以及所有檔案,請謹慎操作。
以下代碼用於刪除log/目錄及目錄下的所有檔案。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫Bucket名稱。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 填寫待刪除目錄的完整路徑,完整路徑中不包含Bucket名稱。
prefix := oss.Prefix("log/")
marker := oss.Marker("")
count := 0
for {
// 列出指定首碼下的所有對象。
lor, err := bucket.ListObjects(marker, prefix)
if err != nil {
log.Fatalf("Failed to list objects in bucket '%s' with prefix '%s': %v", bucketName, prefix, err)
}
objects := []string{}
for _, object := range lor.Objects {
objects = append(objects, object.Key)
}
if len(objects) == 0 {
break
}
// 刪除目錄及目錄下的所有檔案。
// 將oss.DeleteObjectsQuiet設定為true,表示不返回刪除結果。
delRes, err := bucket.DeleteObjects(objects, oss.DeleteObjectsQuiet(true))
if err != nil {
log.Fatalf("Failed to delete objects in bucket '%s': %v", bucketName, err)
}
if len(delRes.DeletedObjects) > 0 {
log.Fatalf("Some objects failed to delete: %v", delRes.DeletedObjects)
}
count += len(objects)
// 更新分頁參數。
marker = oss.Marker(lor.NextMarker)
if !lor.IsTruncated {
break
}
}
log.Printf("Success, total delete object count: %d", count)
}
列舉目錄
使用以下代碼列舉出根目錄下的所有子目錄。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
endpoint := "https://oss-cn-hangzhou.aliyuncs.com" // 請替換為實際的Endpoint
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫儲存空間名稱。
bucketName := "example-bucket" // 請替換為實際的Bucket名稱
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
// 初始的繼續標記
continueToken := ""
// 用於儲存所有子目錄
var subdirectories []string
for {
// 列舉所有子目錄
lsRes, err := bucket.ListObjectsV2(
oss.ContinuationToken(continueToken),
oss.Prefix(""), // 不指定首碼,表示從根目錄開始
oss.Delimiter("/"), // 使用 "/" 類比目錄結構
)
if err != nil {
log.Fatalf("Failed to list objects: %v", err)
}
// 列印並收集子目錄(CommonPrefixes)
for _, prefix := range lsRes.CommonPrefixes {
log.Printf("Subdirectory: %s\n", prefix)
subdirectories = append(subdirectories, prefix)
}
// 如果還有更多個物件需要列舉,則更新繼續標記並繼續迴圈。
if lsRes.IsTruncated {
continueToken = lsRes.NextContinuationToken
} else {
break
}
}
log.Println("All subdirectories have been listed.")
log.Printf("Total subdirectories: %d\n", len(subdirectories))
}
相關文檔
關於建立目錄的API介面說明,請參見PutObject。
關於刪除目錄及目錄下所有檔案的API介面說明,請參見DeleteObject。