本文介绍如何列举指定存储空间下(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)
    }
}