获取目录文件列表

本SDK提供UFileList类用于获取文件目录列表操作,完整代码详见 Github

UFileList::ListUFileList::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;
}