本文介绍如何列举文件。

OSS文件按照字母顺序排列。您可以通过Bucket.ListObjects列出存储空间下的文件。主要的参数如下:

参数 说明
delimiter 对文件名称进行分组的一个字符。所有名称包含指定的前缀且第一次出现delimiter字符之间的文件作为一组元素(commonPrefixes)。
prefix 限定返回的文件必须以prefix作为前缀。
maxKeys 限定此次列举文件的最大个数。默认值为100,最大值为1000。
marker 列举指定marker之后的文件。

ListObjects的完整代码请参见Github

简单列举文件

您可以使用默认参数获取存储空间的文件列表,默认返回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
		}
	}
}

列举指定个数的文件

以下代码用于列举指定个数的文件:

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)
	}

	// 打印结果。
	fmt.Println("Objects:", lsRes.Objects)
	for _, object := range lsRes.Objects {
		fmt.Println("Object:", object.Key)
	}
}

列举指定前缀的文件

以下代码用于列举包含指定前缀(prefix)的文件:

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)
	}

	// 打印结果。
	fmt.Println("Objects:", lsRes.Objects)
	for _, object := range lsRes.Objects {
		fmt.Println("Object:", object.Key)
	}
}

列举指定marker之后的文件

参数marker代表文件名称。以下代码用于列举指定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)
	}

	// 打印结果。
	fmt.Println("Objects:", lsRes.Objects)
	for _, object := range lsRes.Objects {
		fmt.Println("Object:", object.Key)
	}
}

分页列举所有文件

以下代码用于分页列举指定存储空间下的所有文件。每页列举的文件个数通过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)
	}

	// 分页列举所有文件。每页列举200个。
	marker := oss.Marker("")
	for {
		lsRes, err := bucket.ListObjects(oss.MaxKeys(200), marker)
		if err != nil {
			fmt.Println("Error:", err)
			os.Exit(-1)
		}
		marker = oss.Marker(lsRes.NextMarker)

		fmt.Println("Objects:", lsRes.Objects)

		if !lsRes.IsTruncated {
			break
		}
	}
}

分页列举指定marker之后的文件

以下代码用于分页列举指定maker之后的文件。每页列举的文件个数通过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)
	}

	// 分页列举指定maker之后的文件。每页列举200个。
	marker = oss.Marker("my-object-xx")
	for {
		lsRes, err := bucket.ListObjects(oss.MaxKeys(50), marker)
		if err != nil {
			fmt.Println("Error:", err)
			os.Exit(-1)
		}

		marker = oss.Marker(lsRes.NextMarker)

		fmt.Println("Objects:", lsRes.Objects)

		if !lsRes.IsTruncated {
			break
		}
	}
}

分页列举指定前缀的文件

以下代码用于分页列举包含指定前缀的文件。每页列举的文件个数通过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)

		fmt.Println("Objects:", lsRes.Objects)

		if !lsRes.IsTruncated {
			break
		}
	}
}