
# 列举多版本对象
![](https://support.huaweicloud.com/sdk-dotnet-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在github上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-dotnet-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。[接口参考文档](https://obssdk.obs.cn-north-1.myhuaweicloud.com/apidoc/cn/dotnet/html/G_OBS.htm)详细介绍了每个接口的参数和使用方法。
您可以通过ObsClient.ListVersions列举多版本对象。
该接口可设置的参数如下：
| **参数**          | **作用**                                                                                                                     | **OBS .NET SDK** **对应属性**           |
|:---|:---|:---|
| BucketName      | 桶名。                                                                                                                        | ListVersionsRequest.BucketName      |
| Prefix          | 限定返回的对象名必须带有Prefix前缀。                                                                                                      | ListVersionsRequest.Prefix          |
| KeyMarker       | 列举多版本对象的起始位置，返回的对象列表将是对象名按照字典序排序后该参数以后的所有对象。                                                                               | ListVersionsRequest.KeyMarker       |
| MaxKeys         | 列举多版本对象的最大数目，取值范围为1\~1000，当超出范围时，按照默认的1000进行处理。                                                                            | ListVersionsRequest.MaxKeys         |
| Delimiter       | 用于对对象名进行分组的字符。对于对象名中包含Delimiter的对象，其对象名（如果请求中指定了Prefix，则此处的对象名需要去掉Prefix）中从首字符至第一个Delimiter之间的字符串将作为一个分组并作为CommonPrefix返回。 | ListVersionsRequest.Delimiter       |
| VersionIdMarker | 与KeyMarker配合使用，返回的对象列表将是对象名和版本号按照字典序排序后该参数以后的所有对象。                                                                         | ListVersionsRequest.VersionIdMarker |
   
![](https://support.huaweicloud.com/sdk-dotnet-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 如果VersionIdMarker不是KeyMarker的一个版本号，则该参数无效。
- ObsClient.ListVersions返回结果包含多版本对象和对象删除标记。
 
#### 简单列举
以下代码展示如何简单列举多版本对象，最多返回1000个对象：
```
// 初始化配置参数
ObsConfig config = new ObsConfig();
config.Endpoint = "https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
string accessKey= Environment.GetEnvironmentVariable("AccessKeyID", EnvironmentVariableTarget.Machine);
string secretKey= Environment.GetEnvironmentVariable("SecretAccessKey", EnvironmentVariableTarget.Machine);
// 创建ObsClient实例
ObsClient client = new ObsClient(accessKey, secretKey, config);
//列举多版本对象
try
{
    ListVersionsRequest request = new ListVersionsRequest();
    request.BucketName = "bucketname";
    ListVersionsResponse response = client.ListVersions(request);
    foreach (ObsObjectVersion objectVersion in response.Versions)
    {
        Console.WriteLine("Key: {0}", objectVersion.ObjectKey);
        Console.WriteLine("VersionId: {0}", objectVersion.VersionId);
    }
    Console.WriteLine("List versions response: {0}", response.StatusCode);
}
catch (ObsException ex)
{
    Console.WriteLine("ErrorCode: {0}", ex.ErrorCode);
    Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage);
}
```
![](https://support.huaweicloud.com/sdk-dotnet-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
每次至多返回1000个多版本对象，如果指定桶包含的对象数量大于1000，则返回结果中ListVersionsResponse.IsTruncated为true表明本次没有返回全部对象，并可通过ListVersionsResponse.NextKeyMarker和ListVersionsResponse.NextVersionIdMarker获取下次列举的起始位置。
#### 指定数目列举
以下代码展示如何指定数目列举多版本对象：
```
// 初始化配置参数
ObsConfig config = new ObsConfig();
config.Endpoint = "https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
string accessKey= Environment.GetEnvironmentVariable("AccessKeyID", EnvironmentVariableTarget.Machine);
string secretKey= Environment.GetEnvironmentVariable("SecretAccessKey", EnvironmentVariableTarget.Machine);
// 创建ObsClient实例
ObsClient client = new ObsClient(accessKey, secretKey, config);
//指定数目列举
try
{
    ListVersionsRequest request = new ListVersionsRequest();
    request.BucketName = "bucketname";
    request.MaxKeys = 100;
    ListVersionsResponse response = client.ListVersions(request);
    foreach (ObsObjectVersion objectVersion in response.Versions)
    {
        Console.WriteLine("Key: {0}", objectVersion.ObjectKey);
        Console.WriteLine("VersionId: {0}", objectVersion.VersionId);
    }
    Console.WriteLine("List versions response: {0}", response.StatusCode);
}
catch (ObsException ex)
{
    Console.WriteLine("ErrorCode: {0}", ex.ErrorCode);
    Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage);
}
```
#### 指定前缀列举
以下代码展示如何指定前缀列举多版本对象：
```
// 初始化配置参数
ObsConfig config = new ObsConfig();
config.Endpoint = "https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
string accessKey= Environment.GetEnvironmentVariable("AccessKeyID", EnvironmentVariableTarget.Machine);
string secretKey= Environment.GetEnvironmentVariable("SecretAccessKey", EnvironmentVariableTarget.Machine);
// 创建ObsClient实例
ObsClient client = new ObsClient(accessKey, secretKey, config);
//指定前缀列举
try
{
    ListVersionsRequest request = new ListVersionsRequest();
    request.BucketName = "bucketname";
    request.MaxKeys = 100;
    request.Prefix = "prefix";
    ListVersionsResponse response = client.ListVersions(request);
    foreach (ObsObjectVersion objectVersion in response.Versions)
    {
        Console.WriteLine("Key: {0}", objectVersion.ObjectKey);
        Console.WriteLine("VersionId: {0}", objectVersion.VersionId);
    }
    Console.WriteLine("List versions response: {0}", response.StatusCode);
}
catch (ObsException ex)
{
    Console.WriteLine("ErrorCode: {0}", ex.ErrorCode);
    Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage);
}
```
#### 指定起始位置列举
以下代码展示如何指定起始位置列举多版本对象：
```
// 初始化配置参数
ObsConfig config = new ObsConfig();
config.Endpoint = "https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
string accessKey= Environment.GetEnvironmentVariable("AccessKeyID", EnvironmentVariableTarget.Machine);
string secretKey= Environment.GetEnvironmentVariable("SecretAccessKey", EnvironmentVariableTarget.Machine);
// 创建ObsClient实例
ObsClient client = new ObsClient(accessKey, secretKey, config);
//指定起始位置列举
try
{
    ListVersionsRequest request = new ListVersionsRequest();
    request.BucketName = "bucketname";
    request.MaxKeys = 100;
    request.Prefix = "prefix";
    request.KeyMarker = "keyMarker";
    ListVersionsResponse response = client.ListVersions(request);
    foreach (ObsObjectVersion objectVersion in response.Versions)
    {
        Console.WriteLine("Key: {0}", objectVersion.ObjectKey);
        Console.WriteLine("VersionId: {0}", objectVersion.VersionId);
    }
    Console.WriteLine("List versions response: {0}", response.StatusCode);
}
catch (ObsException ex)
{
    Console.WriteLine("ErrorCode: {0}", ex.ErrorCode);
    Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage);
}
```
#### 分页列举全部多版本对象
以下代码展示分页列举全部多版本对象：
```
// 初始化配置参数
ObsConfig config = new ObsConfig();
config.Endpoint = "https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
string accessKey= Environment.GetEnvironmentVariable("AccessKeyID", EnvironmentVariableTarget.Machine);
string secretKey= Environment.GetEnvironmentVariable("SecretAccessKey", EnvironmentVariableTarget.Machine);
// 创建ObsClient实例
ObsClient client = new ObsClient(accessKey, secretKey, config);
//分页列举全部多版本对象
try
{
    ListVersionsRequest request = new ListVersionsRequest();
    request.BucketName = "bucketname";
    request.MaxKeys = 100;
    ListVersionsResponse response;
    do
    {
        response = client.ListVersions(request);
        Console.WriteLine("List versions response: {0}", response.StatusCode);
        foreach (ObsObjectVersion objectVersion in response.Versions)
        {
            Console.WriteLine("Key: {0}", objectVersion.ObjectKey);
            Console.WriteLine("VersionId: {0}", objectVersion.VersionId);
        }
        request.KeyMarker = response.NextKeyMarker;
        request.VersionIdMarker = response.NextVersionIdMarker;
    }
    while (response.IsTruncated);
}
catch (ObsException ex)
{
    Console.WriteLine("ErrorCode: {0}", ex.ErrorCode);
    Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage);
}
```
#### 列举文件夹中的所有多版本对象
OBS本身是没有文件夹的概念的，桶中存储的元素只有对象。文件夹对象实际上是一个大小为0且对象名以"/"结尾的对象，将这个文件夹对象名作为前缀，即可模拟列举文件夹中对象的功能。以下代码展示如何列举文件夹中的多版本对象：
```
// 初始化配置参数
ObsConfig config = new ObsConfig();
config.Endpoint = "https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
string accessKey= Environment.GetEnvironmentVariable("AccessKeyID", EnvironmentVariableTarget.Machine);
string secretKey= Environment.GetEnvironmentVariable("SecretAccessKey", EnvironmentVariableTarget.Machine);
// 创建ObsClient实例
ObsClient client = new ObsClient(accessKey, secretKey, config);
//分页列举全部多版本对象
try
{
    ListVersionsRequest request = new ListVersionsRequest();
    request.BucketName = "bucketname";
    request.MaxKeys = 1000;
    // 设置文件夹对象名"dir/"为前缀
    request.Prefix = "dir/";
    ListVersionsResponse response;
    do
    {
        response = client.ListVersions(request);
        Console.WriteLine("List versions response: {0}", response.StatusCode);
        foreach (ObsObjectVersion objectVersion in response.Versions)
        {
            Console.WriteLine("Key: {0}", objectVersion.ObjectKey);
            Console.WriteLine("VersionId: {0}", objectVersion.VersionId);
        }
        request.KeyMarker = response.NextKeyMarker;
        request.VersionIdMarker = response.NextVersionIdMarker;
    }
    while (response.IsTruncated);
}
catch (ObsException ex)
{
    Console.WriteLine("ErrorCode: {0}", ex.ErrorCode);
    Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage);
}
```
