本SDK提供UFileList
类用于获取文件目录列表操作,完整代码详见 Github 。
UFileList::List
和UFileList::ListDir
调用的 US3 API 为ListObjects
, 具体参见GetFile API文档。
方法原型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
* 列出指定前缀的所有文件
* 参数说明:
* `bucket`: 文件所在的存储空间
* `prefix`: 前缀, 若传空, 表示列整个bucket的文件
* `count`: 要列的目录文件列表的最大数量, 最大为1000
* `result`: 要保存返回结果的list对象的地址
* `is_truncated`: 指示此次返回结果是否被截断, 若值为true, 则表示返回结果由于达到count的限制而被截断
* `next_marker`: 当is_truncated为true时,next_marker被设置, 下次List可以使用此值作为prefix, 实现迭代查询
* `marker`: 用于迭代查询, 如要上次查询如果被截断, 这次查询可以将此参数设置为上次查询结果返回的next_marker, 继续查询。默认为空, 表示从头查询
*/
int List(const std::string &bucket, const std::string &prefix, uint32_t count, ListResult *result, bool *is_truncated, std::string *next_marker, const std::string &marker = "");
/*
* 返回指定前缀的目录形式的文件列表
* `bucket`: 文件所在的存储空间
* `prefix`: 前缀, 若传空, 表示列整个bucket的文件
* `count`: 要列的目录文件列表的最大数量, 最大为1000
* `result`: 要保存返回结果的list对象的地址
* `is_truncated`: 指示此次返回结果是否被截断, 若值为true, 则表示返回结果由于达到count的限制而被截断为true, 则表示返回结果由于达到count的限制而被截断
* `next_marker`: 当is_truncated为true时,next_marker被设置, 下次List可以使用此值作为prefix, 实现迭代查询
* `marker`: 用于迭代查询, 如要上次查询如果被截断, 这次查询可以将此参数设置为上次查询结果返回的next_marker, 继续查询。默认为空, 表示从头查询
*/
int ListDir(const std::string &bucket, const std::string &prefix,
uint32_t count, std::list<std::string> *result,
bool *is_truncated, std::string *next_marker,
const std::string &marker = "");
struct ListResultEntry {
std::string filename; // 文件名称
std::string mime_type; // 文件mimetype
std::string etag; // 标识文件内容
uint64_t size; // 文件大小
std::string storage_class; // 文件存储类型
uint64_t last_modified; //文件最后修改时间
uint64_t create_time; // 文件创建时间
};
typedef std::list<ListResultEntry> ListResult;
示例
执行该示例前请确保配置文件的正确性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <cstring>
#include <ufile-cppsdk/api.h>
const char* bucket_name = "your bucket name";
const char* prefix = "your prefix";
int main() {
// 实例化一个UFileDownload对象
ucloud::cppsdk::api::UFileList lister;
// 定义一个保存查询结果的list
ucloud::cppsdk::api::ListResult result;
bool is_truncated = true;
std::string next_marker;
std::string marker = "";
uint32_t count = 1000;
// 调用成员函数List列出bucket内以prefix为前缀的所有文件
while (is_truncated) {
int ret = lister.List(bucket_name, prefix, count, &result,
&is_truncated, &next_marker, marker);
if (ret) {
std::cerr << "list error: retcode=" << UFILE_LAST_RETCODE() \
<< ", errmsg=" << UFILE_LAST_ERRMSG() << std::endl;
return ret;
}
marker = next_marker;
for (auto it = result.begin(); it != result.end(); ++it) {
std::cout << "found file: " << (*it).filename << std::endl;
}
}
std::cout << "list file success." << std::endl;
// 定义一个保存查询结果的list
std::list<std::string> result2;
is_truncated = true;
marker = "";
// 调用成员函数ListDir列出bucket内以prefix为前缀的目录结构的所有key
while (is_truncated) {
int ret = lister.ListDir(bucket_name, prefix, count, &result2,
&is_truncated, &next_marker, marker);
if (ret) {
std::cerr << "listdir error: retcode=" << UFILE_LAST_RETCODE() \
<< ", errmsg=" << UFILE_LAST_ERRMSG() << std::endl;
return ret;
}
marker = next_marker;
for (auto it = result2.begin(); it != result2.end(); ++it) {
std::cout << "found key: " << *it << std::endl;
}
}
std::cout << "list dir success." << std::endl;
return 0;
}