本文介绍如何列举指定存储空间下(Bucket)的所有文件(Object)、指定前缀的文件、指定目录下的文件和子目录等。
背景信息
您可以调用GetBucket (ListObjects)或GetBucketV2 (ListObjectsV2)接口,一次性列举某个Bucket下最多1000个Object。您可以通过指定参数实现多种列举功能,例如通过指定参数列举指定起始位置后的所有文件、列举指定目录下的文件和子目录以及列举结果分页。这两个接口的主要区别如下:
- 使用GetBucket (ListObjects)接口列举文件时,默认返回Owner信息。
- 使用GetBucketV2 (ListObjectsV2)接口列举文件时,需通过fetchOwner指定是否在返回结果中包含Owner信息。
说明 对于开启版本控制的Bucket,建议使用GetBucketV2 (ListObjectsV2)接口列举文件。
以下分别介绍通过GetBucket (ListObjects)以及GetBucketV2 (ListObjectsV2)方法列举文件时涉及的参数说明。
- 通过GetBucket (ListObjects)方法列举文件
GetBucket (ListObjects)涉及参数说明如下:
参数 说明 delimiter 对文件名称进行分组的一个字符。所有名称包含指定的前缀且第一次出现delimiter字符之间的文件作为一组元素(commonPrefixes)。 prefix 限定返回的文件必须以prefix作为前缀。 maxKeys 限定此次列举文件的最大个数。默认值为100,最大值为1000。 marker 此次列举文件的起点。 更多信息,请参见GetBucket (ListObjects)。
- 通过GetBucketV2 (ListObjectsV2)方法列举文件
GetBucketV2 (ListObjectsV2)涉及参数说明如下:
参数 描述 prefix 限定返回的文件必须以prefix作为前缀。 delimiter 对文件名称进行分组的一个字符。所有名称包含指定的前缀且第一次出现delimiter字符之间的文件作为一组元素(commonPrefixes)。 startAfter 此次列举文件的起点。 fetchOwner 指定是否在返回结果中包含Owner信息。 - true:表示返回结果中包含Owner信息。
- false:表示返回结果中不包含Owner信息。
更多信息,请参见GetBucketV2 (ListObjectsV2)。
简单列举文件
- 通过GetBucket (ListObjects)方法列举
通过GetBucket (ListObjects)方法列举指定Bucket下的100个文件的示例代码如下:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 列举所有文件。 marker := "" for { lsRes, err := bucket.ListObjects(oss.Marker(marker)) if err != nil { HandleError(err) } // 打印列举结果。默认情况下,一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println("Bucket: ", object.Key) } if lsRes.IsTruncated { marker = lsRes.NextMarker } else { break } } }
- 通过GetBucketV2 (ListObjectsV2)方法列举
通过GetBucketV2 (ListObjectsV2)方法列举指定Bucket下的100个文件的示例代码如下:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } continueToken := "" for { lsRes, err := bucket.ListObjectsV2(oss.ContinuationToken(continueToken)) if err != nil { HandleError(err) } // 打印列举结果。默认情况下,一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass) } if lsRes.IsTruncated { continueToken = lsRes.NextContinuationToken } else { break } } }
列举指定个数的文件
- 通过GetBucket (ListObjects)方法列举
通过GetBucket (ListObjects)方法列举指定个数文件的示例代码如下:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } bucketName := "<yourBucketName>" // 获取存储空间。 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 设置列举文件的最大个数,并列举文件。 lsRes, err := bucket.ListObjects(oss.MaxKeys(200)) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 打印列举结果。默认情况下,一次返回100条记录。 fmt.Println("Objects:", lsRes.Objects) for _, object := range lsRes.Objects { fmt.Println("Object:", object.Key) } }
- 通过GetBucketV2 (ListObjectsV2)方法列举
通过GetBucketV2 (ListObjectsV2)方法列举指定个数文件的示例代码如下:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 通过MaxKeys设置文件列举的最大个数,并列举文件。 lsRes, err := bucket.ListObjectsV2(oss.MaxKeys(200)) if err != nil { HandleError(err) } // 打印列举结果。默认情况下,一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass, object.Owner.ID, object.Owner.DisplayName) } }
列举指定前缀的文件
- 通过GetBucket (ListObjects)方法列举
通过GetBucket (ListObjects)方法列举指定前缀的文件的示例代码如下:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } bucketName := "<yourBucketName>" // 获取存储空间。 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 列举包含指定前缀的文件。默认列举100个文件。 lsRes, err := bucket.ListObjects(oss.Prefix("my-object-")) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 打印列举结果。默认情况下,一次返回100条记录。 fmt.Println("Objects:", lsRes.Objects) for _, object := range lsRes.Objects { fmt.Println("Object:", object.Key) } }
- 通过GetBucketV2 (ListObjectsV2)方法列举
通过GetBucketV2 (ListObjectsV2)方法列举指定前缀的文件的示例代码如下:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 通过Prefix参数设置列举的文件前缀为my-object-。 lsRes, err := bucket.ListObjectsV2(oss.Prefix("my-object-")) if err != nil { HandleError(err) } // 打印列举结果。默认情况下,一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass, object.Owner.ID, object.Owner.DisplayName) } }
列举指定起始位置之后的文件
- 通过GetBucket (ListObjects)方法列举
通过设置Marker参数指定列举的起始位置,OSS将返回Marker字典序后的所有文件。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } bucketName := "<yourBucketName>" // 获取存储空间。 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 指定列举Marker之后的文件。默认列举100个文件。 lsRes, err := bucket.ListObjects(oss.Marker("my-object-xx")) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 打印列举结果。默认情况下,一次返回100条记录。 fmt.Println("Objects:", lsRes.Objects) for _, object := range lsRes.Objects { fmt.Println("Object:", object.Key) } }
- 通过GetBucketV2 (ListObjectsV2)方法列举
通过设置StartAfter参数可以指定列举的起始位置,OSS将返回StartAfter字典序后的所有文件。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 指定列举StartAfter之后的文件。默认列举100个文件。 lsRes, err := bucket.ListObjectsV2(oss.StartAfter("my-object-")) if err != nil { HandleError(err) } // 打印列举结果。默认情况下,一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass, object.Owner.ID, object.Owner.DisplayName) } }
分页列举所有文件
- 通过GetBucket (ListObjects)方法列举
通过GetBucket (ListObjects)方法列举分页列举指定Bucket下的所有文件。每页列举的文件个数通过MaxKeys指定。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } bucketName := "<yourBucketName>" // 获取存储空间。 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 分页列举所有文件。每页列举100个。 marker := oss.Marker("") for { lsRes, err := bucket.ListObjects(oss.MaxKeys(100), marker) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } marker = oss.Marker(lsRes.NextMarker) // 打印列举结果。默认情况下,一次返回100条记录。 fmt.Println("Objects:", lsRes.Objects) if !lsRes.IsTruncated { break } } }
- 通过GetBucketV2 (ListObjectsV2)方法列举
通过GetBucketV2 (ListObjectsV2)方法列举分页列举指定Bucket下的所有文件。每页列举的文件个数通过MaxKeys指定。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 分页列举所有文件。每页列举100个。 continueToken := "" for { lsRes, err := bucket.ListObjectsV2(oss.MaxKeys(100), oss.ContinuationToken(continueToken)) if err != nil { HandleError(err) } // 打印列举结果。默认情况下,一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass) } if lsRes.IsTruncated { continueToken = lsRes.NextContinuationToken } else { break } } }
分页列举指定前缀的文件
- 通过GetBucket (ListObjects)方法列举
通过GetBucket (ListObjects)方法分页列举指定前缀的文件。每页列举的文件个数通过MaxKeys指定。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } bucketName := "<yourBucketName>" // 获取存储空间。 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 分页列举包含指定前缀的文件。每页列举80个。 prefix := oss.Prefix("my-object-") marker := oss.Marker("") for { lsRes, err := bucket.ListObjects(oss.MaxKeys(80), marker, prefix) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } prefix = oss.Prefix(lsRes.Prefix) marker = oss.Marker(lsRes.NextMarker) // 打印列举结果。默认情况下,一次返回100条记录。 fmt.Println("Objects:", lsRes.Objects) if !lsRes.IsTruncated { break } } }
- 通过GetBucketV2 (ListObjectsV2)方法列举
通过GetBucketV2 (ListObjectsV2)方法分页列举指定前缀的文件。每页列举的文件个数通过MaxKeys指定。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 分页列举指定前缀的文件。每页列举80个。 prefix := "my-object-" continueToken := "" for { lsRes, err := bucket.ListObjectsV2(oss.Prefix(prefix), oss.MaxKeys(80), oss.ContinuationToken(continueToken)) if err != nil { HandleError(err) } // 打印列举结果。默认情况下,一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass) } if lsRes.IsTruncated { continueToken = lsRes.NextContinuationToken } else { break } } }
列举指定目录下所有文件的信息
- 通过GetBucket (ListObjects)方法列举
通过GetBucket (ListObjects)方法列举指定前缀(目录)下所有文件的信息,包括文件大小、文件最后修改时间以及文件名等。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 获取存储空间。 bucket, err := client.Bucket("<yourBucketName>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 遍历文件。 marker := oss.Marker("") prefix := oss.Prefix("<yourObjectPrefix>") for { lor, err := bucket.ListObjects(marker, prefix) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } for _, object := range lor.Objects { fmt.Printf("%s %d %s\n", object.LastModified, object.Size, object.Key) } prefix = oss.Prefix(lor.Prefix) marker = oss.Marker(lor.NextMarker) if !lor.IsTruncated { break } } }
- 通过GetBucketV2 (ListObjectsV2)方法列举
通过GetBucketV2 (ListObjectsV2)方法列举指定前缀(目录)下所有文件的信息,包括文件大小、文件最后修改时间以及文件名等。
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } continueToken := "" prefix := "my-object-" for { lsRes, err := bucket.ListObjectsV2(oss.Prefix(prefix), oss.ContinuationToken(continueToken)) if err != nil { HandleError(err) } // 打印列举文件,默认情况下,一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass) } if lsRes.IsTruncated { continueToken = lsRes.NextContinuationToken } else { break } } }
列举指定目录下所有子目录的信息
- 通过GetBucket (ListObjects)方法列举
通过GetBucket (ListObjects)方法列举指定前缀(目录)下所有子目录信息的示例代码如下:
import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 获取存储空间。 bucket, err := client.Bucket("<yourBucketName>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } marker := oss.Marker("") prefix := oss.Prefix("<yourDirPrefix>") for { lor, err := bucket.ListObjects(marker, prefix, oss.Delimiter("/")) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } for _, dirName := range lor.CommonPrefixes { fmt.Println(dirName) } prefix = oss.Prefix(lor.Prefix) marker = oss.Marker(lor.NextMarker) if !lor.IsTruncated { break } } }
- 通过GetBucketV2 (ListObjectsV2)方法列举
通过GetBucketV2 (ListObjectsV2)方法列举指定前缀(目录)下所有子目录信息的示例代码如下:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } continueToken := "" prefix := "<yourDirPrefix>" for { lsRes, err := bucket.ListObjectsV2(oss.Prefix(prefix), oss.ContinuationToken(continueToken), oss.Delimiter("/")) if err != nil { HandleError(err) } for _, dirName := range lsRes.CommonPrefixes { fmt.Println(dirName) } if lsRes.IsTruncated { continueToken = lsRes.NextContinuationToken } else { break } } }
列举文件并返回Owner信息
通过GetBucketV2 (ListObjectsV2)方法列举文件并返回Owner信息示例代码如下:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { HandleError(err) } // 获取存储空间。 bucketName := "<yourBucketName>" bucket, err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 获取Owner信息。 lsRes, err := bucket.ListObjectsV2(oss.FetchOwner(true)) if err != nil { HandleError(err) } // 打印列举文件,默认情况下一次返回100条记录。 for _, object := range lsRes.Objects { fmt.Println(object.Key, object.Owner.ID, object.Owner.DisplayName) } }