
# 列举对象
您可以通过listObjects列举出桶里的对象。
该接口可设置的参数如下：
| **参数**     | **作用**                                                                                                                                                                                                                                                                     | **OBS iOS SDK对应方法** |
|:---|:---|:---|
| bucketName | 桶名。                                                                                                                                                                                                                                                                        | request.bucketName  |
| prefix     | 限定返回的对象名必须带有prefix前缀。                                                                                                                                                                                                                                                      | request.prefix      |
| marker     | 列举对象的起始位置，返回的对象列表将是对象名按照字典序排序后该参数以后的所有对象。                                                                                                                                                                                                                                  | request.marker      |
| maxKeys    | 列举对象的最大数目，取值范围为1\~1000，当超出范围时，按照默认的1000进行处理。                                                                                                                                                                                                                               | request.maxKeys     |
| delimiter  | 用于对对象名进行分组的字符。对于对象名中包含delimiter的对象，其对象名（如果请求中指定了prefix，则此处的对象名需要去掉prefix）中从首字符至第一个delimiter之间的字符串将作为一个分组并作为commonPrefix返回。 对于并行文件系统，不携带此参数时默认列举是递归列举此目录下所有内容，会列举子目录。在大数据场景下（目录层级深、目录下文件多）的列举，建议设置\[delimiter="/"\]，只列举当前目录下的内容，不列举子目录，提高列举效率。 | request.delimiter   |
   
#### 简单列举
以下代码展示如何简单列举对象，最多返回1000个对象：
```
static OBSClient *client;
NSString *endPoint = @"https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
    
// 初始化身份验证
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//初始化服务配置
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// 初始化client
client = [[OBSClient alloc] initWithConfiguration:conf];
    
// 列举对象
OBSListObjectsRequest *request = [[OBSListObjectsRequest alloc] initWithBucketName:@"bucketname"];
    
[client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
    for (int i =0; i<response.contentsList.count; i++) {
        NSLog(@"%@ \n",response.contentsList[i].key);
    }
}];
```
![](https://support.huaweicloud.com/sdk-ios-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 每次至多返回1000个对象，如果指定桶包含的对象数量大于1000，则返回结果中response.isTruncated为YES表明本次没有返回全部对象，并可通过response.nextMarker获取下次列举的起始位置。
- 如果想获取指定桶包含的所有对象，可以采用分页列举的方式。
 
#### 指定数目列举
以下代码展示如何指定数目列举对象：
```
static OBSClient *client;
NSString *endPoint = @"https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
    
// 初始化身份验证
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//初始化服务配置
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// 初始化client
client = [[OBSClient alloc] initWithConfiguration:conf];
    
// 列举对象
OBSListObjectsRequest *request = [[OBSListObjectsRequest alloc] initWithBucketName:@"bucketname"];
// 只列举一个对象
request.maxKeys = [NSNumber numberWithInt:1];
    
[client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
    for (int i =0; i<response.contentsList.count; i++) {
       NSLog(@"%@ \n",response.contentsList[i].key);
   }
}];
```
#### 指定前缀列举
以下代码展示如何指定前缀列举对象：
```
static OBSClient *client;
NSString *endPoint = @"https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
    
// 初始化身份验证
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//初始化服务配置
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// 初始化client
client = [[OBSClient alloc] initWithConfiguration:conf];
    
// 列举对象
OBSListObjectsRequest *request = [[OBSListObjectsRequest alloc] initWithBucketName:@"bucketname"];
// 指定列出前缀为testdir2的对象
request.prefix = @"/testdir2/";
    
[client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
    for (int i =0; i<response.contentsList.count; i++) {
        NSLog(@"%@ \n",response.contentsList[i].key);
    }
}];
```
#### 指定起始位置列举
以下代码展示如何指定起始位置列举对象：
```
static OBSClient *client;
NSString *endPoint = @"https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
    
// 初始化身份验证
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//初始化服务配置
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// 初始化client
client = [[OBSClient alloc] initWithConfiguration:conf];
    
// 列举对象
OBSListObjectsRequest *request = [[OBSListObjectsRequest alloc] initWithBucketName:@"bucketname"];
    
//设置列举对象名字典序在"test"之后的对象
request.marker = @"test";
[client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
    for (int i =0; i<response.contentsList.count; i++) {
        NSLog(@"%@ \n",response.contentsList[i].key);
    }
}];
```
#### 分页列举全部对象
以下代码展示分页列举全部对象：
```
static OBSClient *client;
NSString *endPoint = @"https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
    
// 初始化身份验证
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//初始化服务配置
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// 初始化client
client = [[OBSClient alloc] initWithConfiguration:conf];
    
__block OBSListObjectsResponse *result;
    
// 列举对象
OBSListObjectsRequest *request = [[OBSListObjectsRequest alloc] initWithBucketName:@"bucketname"];
    
request.maxKeys = [NSNumber numberWithInt:1];
// 列举全部对象
do {
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    [client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
        result = response;
     for (int i =0; i<response.contentsList.count; i++) {
        NSLog(@"%@ \n",response.contentsList[i].key);
     }
        request.marker = result.nextMarker;
        dispatch_semaphore_signal(sema);
   }];
   dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 300 * NSEC_PER_SEC));
} while (result && result.isTruncated);
```
#### 列举文件夹中的所有对象
OBS本身是没有文件夹的概念的，桶中存储的元素只有对象。文件夹对象实际上是一个大小为0且对象名以"/"结尾的对象，将这个文件夹对象名作为前缀，即可模拟列举文件夹中对象的功能。以下代码展示如何列举文件夹中的对象：
```
static OBSClient *client;
NSString *endPoint = @"https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
    
// 初始化身份验证
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//初始化服务配置
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// 初始化client
client = [[OBSClient alloc] initWithConfiguration:conf];
    
// 列举对象
OBSListObjectsRequest *request = [[OBSListObjectsRequest alloc] initWithBucketName:@"bucketname"];
    
request.prefix = @"file/";
    
__block OBSListObjectsResponse *result;
do {
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    [client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
        result = response;for (int i =0; i<response.contentsList.count; i++) {
            NSLog(@"%@ \n",response.contentsList[i].key);
        }
        request.marker = result.nextMarker;
        dispatch_semaphore_signal(sema);
    }];
    dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 300 * NSEC_PER_SEC));} while (result && result.isTruncated);
```
#### 列举根目录下所有文件夹
以下代码展示如何列举根目录下的所有文件夹信息
```
static OBSClient *client;
NSString *endPoint = @"https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
// 初始化身份验证
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//初始化服务配置
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// 初始化client
client = [[OBSClient alloc] initWithConfiguration:conf];
// 列举对象
OBSListObjectsRequest *request = [[OBSListObjectsRequest alloc] initWithBucketName:@"bucketname"];
  
request.delimiter = @"/";
// 列举根目录中的文件夹
[client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
    for (int i =0; i<response.commonPrefixesList.count; i++) {
        NSLog(@"%@ \n",response.commonPrefixesList[i].prefix);
    }
        
}];
```
#### 按文件夹分组列举所有对象
以下代码展示如何按文件夹分组，列举桶内所有对象：
```
static OBSClient *client;
NSString *endPoint = @"https://your-endpoint";
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
    
// 初始化身份验证
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//初始化服务配置
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// 初始化client
client = [[OBSClient alloc] initWithConfiguration:conf];
    
// 列举对象
OBSListObjectsRequest *request = [[OBSListObjectsRequest alloc] initWithBucketName:@"bucketname"];
    
request.delimiter = @"/";
// 根目录中的对象
[client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
    [self listObjectsByPrefix:client request:request result:response];
    for (int i =0; i<response.contentsList.count; i++) {
        NSLog(@"%@ \n",response.contentsList[i].key);
    }
        
}];
```
listObjectsByPrefix函数：
```
-(void) listObjectsByPrefix:(OBSClient*) client request:(OBSListObjectsRequest *) request result:(OBSListObjectsResponse*) result{
    
    for (OBSCommonPrefix *prefix in result.commonPrefixesList){
        request.prefix = prefix.prefix;
        
        [client listObjects:request completionHandler:^(OBSListObjectsResponse *response, NSError *error) {
            // 异步变同步
            dispatch_semaphore_t sema = dispatch_semaphore_create(0);
            NSLog(@"文件夹[%@]中的对象:",prefix.prefix);
            for (int i=0; i<response.contentsList.count; i++) {
                NSLog(@"%@ \n",response.contentsList[i].key);
            }
            dispatch_semaphore_signal(sema);
            dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 300 * NSEC_PER_SEC));
            [self listObjectsByPrefix:client request:request result:response];
        }];
    }
    
}
```
![](https://support.huaweicloud.com/sdk-ios-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 以上代码示例没有考虑文件夹中对象数超过1000个的情况。
- 由于是需要列举出文件夹中的对象和子文件夹，且文件夹对象总是以"/"结尾，因此delimiter总是为"/"。
- result.commonPrefixesList包含的是文件夹的子文件夹。
- listObjectsByPrefix函数需要在头文件中导入OBSListObjectsModel.h。
 
