列举存储空间中的文件
列举存储空间中的文件
BOS SDK支持用户通过以下两种方式列举出object:
- 简单列举
- 通过参数复杂列举
除此之外,用户还可在列出文件的同时模拟文件夹
简单列举
当用户希望简单快速列举出所需的文件时,可通过bos_list_object方法修改bos_list_object_params_t结构体,bos_list_object_params_t对象包含了此次listObject请求的返回结果。用户可以通过bos_list_object_params_t中的getContents方法获取所有object_list的描述信息。
bos_pool_t *p = NULL;
bos_string_t bucket;
bos_request_options_t *options = NULL;
int is_cname = 0;
bos_table_t *resp_headers = NULL;
bos_status_t *s = NULL;
bos_list_object_params_t *params = NULL;
bos_list_object_content_t *content = NULL;
int size = 0;
char *key = NULL;
bos_pool_create(&p, NULL);
options = bos_request_options_create(p);
init_test_request_options(options, is_cname);
params = bos_create_list_object_params(p);
params->max_ret = 1;
params->truncated = 0;
bos_str_set(¶ms->prefix, "bos_test");
bos_str_set(&bucket, TEST_BUCKET_NAME);
s = bos_list_object(options, &bucket, params, &resp_headers);
//bos_list_for_each_entry(bos_list_object_content_t, content, ¶ms->object_list, node) {
// ++size;
// key = apr_psprintf(p, "%.*s", content->key.len, content->key.data);
//}
注意:
- 默认情况下,如果Bucket中的Object数量大于1000,则只会返回1000个Object,并且返回结果中is_truncated值为True,并返回next_marker做为下次读取的起点。
- 若想增大返回Object的数目,可以使用marker参数分次读取。
通过参数复杂列举
除上述简单列举外,用户还可通过设置params的参数实现各种灵活的查询功能。params的可设置的参数如下:
参数 | 功能 | |
---|---|---|
prefix | 限定返回的object key必须以prefix作为前缀 | |
delimiter | 是一个用于对Object名字进行分组的字符所有名字包含指定的前缀且第一次出现。Delimiter字符之间的object作为一组元素: CommonPrefixes | |
marker | 设定结果从marker之后按字母排序的第一个开始返回 | |
max_ret | 限定此次返回object的最大数,最大为1000,默认值是1000。如果指定的值大于1000,按1000操作 |
注意:
- 如果有Object以Prefix命名,当仅使用Prefix查询时,返回的所有Key中仍会包含以Prefix命名的Object,详见递归列出目录下所有文件。
- 如果有Object以Prefix命名,当使用Prefix和Delimiter组合查询时,返回的所有Key中会有Null,Key的名字不包含Prefix前缀,详见查看目录下的文件和子目录。
下面我们分别以几个案例说明通过参数列举的方法:
指定最大返回条数
params->max_ret = 100;
返回指定前缀的object
bos_str_set(¶ms->prefix, "bos_test");
从指定Object后返回
bos_str_set(¶ms->marker, params->next_marker.data);
bos_list_object_params_t
解析类中可供调用的参数有:
参数 | 说明 |
---|---|
name | Bucket名称 |
prefix | 匹配以prefix开始到第一次出现Delimiter字符之间的object作为一组元素返回 |
marker | 本次查询的起点 |
max_ret | 请求返回的最大数目 |
is_truncated | 指明是否所有查询都返回了;false-本次已经返回所有结果,true-本次还没有返回所有结果 |
object_list | 返回的一个Object的列表 |
+key | Object名称 |
+last_modified | 此Object最后一次被修改的时间 |
+etag | Object的HTTP协议实体便签 |
+storage_class | Object的存储形态 |
+size | Object的内容的大小(字节数) |
+owner_id | Bucket Owner的用户ID |
+owner_display_name | Bucket Owner的名称 |
common_prefix_list | 返回的common prefix的列表 |
模拟文件夹功能
在BOS的存储结果中是没有文件夹这个概念的,所有元素都是以Object来存储,但BOS的用户在使用数据时往往需要以文件夹来管理文件。 因此,BOS提供了创建模拟文件夹的能力,其本质上来说是创建了一个size为0的Object。对于这个Object可以上传下载,只是控制台会对以”/“结尾的Object以文件夹的方式展示。
用户可以通过 Delimiter 和 Prefix 参数的配合模拟出文件夹功能。Delimiter 和 Prefix 的组合效果是这样的:
如果把 Prefix 设为某个文件夹名,就可以罗列以此 Prefix 开头的文件,即该文件夹下递归的所有的文件和子文件夹(目录)。文件名在Contents中显示。 如果再把 Delimiter 设置为 “/” 时,返回值就只罗列该文件夹下的文件和子文件夹(目录),该文件夹下的子文件名(目录)返回在 CommonPrefixes 部分,子文件夹下递归的文件和文件夹不被显示。
如下是几个应用方式:
列出Bucket内所有文件
当用户需要获取Bucket下的所有文件时,可以参考分页获取所有Object
递归列出目录下所有文件
可以通过设置 Prefix
参数来获取某个目录下所有的文件:
void test_list_object_with_delimiter(CuTest *tc)
{
bos_pool_t *p = NULL;
bos_string_t bucket;
bos_request_options_t *options = NULL;
int is_cname = 0;
bos_table_t *resp_headers = NULL;
bos_status_t *s = NULL;
bos_list_object_params_t *params = NULL;
bos_list_object_common_prefix_t *common_prefix = NULL;
int size = 0;
char *prefix = NULL;
bos_pool_create(&p, NULL);
options = bos_request_options_create(p);
init_test_request_options(options, is_cname);
params = bos_create_list_object_params(p);
params->max_ret = 5;
params->truncated = 0;
bos_str_set(¶ms->prefix, "bos_tmp");
bos_str_set(¶ms->delimiter, "/");
bos_str_set(&bucket, TEST_BUCKET_NAME);
s = bos_list_object(options, &bucket, params, &resp_headers);
bos_list_for_each_entry(bos_list_object_common_prefix_t, common_prefix, ¶ms->common_prefix_list, node) {
++size;
prefix = apr_psprintf(p, "%.*s", common_prefix->prefix.len,
common_prefix->prefix.data);
}
bos_pool_destroy(p);
printf("test_list_object_with_delimiter ok\n");
}