开发者社区> 问答> 正文

.NET-SDK之如何实现管理文件(二)?


通过异步方式列出文件

  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. static OssClient ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. static AutoResetEvent _event = new AutoResetEvent(false);
  5. public static void AsyncListObjects()
  6. {
  7.     try
  8.     {
  9.         var listObjectsRequest = new ListObjectsRequest(bucketName);
  10.         ossClient.BeginListObjects(listObjectsRequest, ListObjectCallback, null);
  11.         _event.WaitOne();
  12.     }
  13.     catch (Exception ex)
  14.     {
  15.          Console.WriteLine("List objects failed. {0}", ex.Message);
  16.     }
  17. }
  18. private static void ListObjectCallback(IAsyncResult ar)
  19. {
  20.     try
  21.     {
  22.         var result = ossClient.EndListObjects(ar);
  23.         foreach (var summary in result.ObjectSummaries)
  24.         {
  25.             Console.WriteLine("文件名称:{0}", summary.Key);
  26.         }
  27.         _event.Set();
  28.         Console.WriteLine("List objects succeeded");
  29.     }
  30.     catch (Exception ex)
  31.     {
  32.          Console.WriteLine("List objects failed. {0}", ex.Message);
  33.     }  
  34. }

说明:
  • 完整代码参考GitHub
  • 上面的ListObjectCallback方法就是异步调用结束后执行的回调方法,如果使用异步类型的接口,都需要实现类似接口。


通过ListObjectsRequest列出文件


我们可以通过设置ListObjectsRequest的参数来完成更强大的功能。比如:
  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. /// <summary>
  5. /// 列出指定存储空间下的文件的摘要信息OssObjectSummary列表
  6. /// </summary>
  7. /// <param name="bucketName">存储空间的名称</param>
  8. public void ListObjects(string bucketName)
  9. {
  10.     try
  11.     {
  12.         var listObjectsRequest = new ListObjectsRequest(bucketName)
  13.         {
  14.             Delimiter = "/",
  15.             Marker = "abc"
  16.         };
  17.         result = client.ListObjects(listObjectsRequest);
  18.         Console.WriteLine("List objects succeeded");            
  19.         foreach (var summary in result.ObjectSummaries)
  20.         {
  21.             Console.WriteLine("文件名称:{0}", summary.Key);
  22.         }
  23.     }
  24.     catch (Exception ex)
  25.     {
  26.          Console.WriteLine("List objects failed. {0}", ex.Message);
  27.     }      
  28. }

可以设置的参数名称和作用如下:
名称作用
Delimiter用于对文件名字进行分组的字符。所有名字包含指定的前缀且第一次出现Delimiter字符之间的文件作为一组元素: CommonPrefixes。
Marker设定结果从Marker之后按字母排序的第一个开始返回。
MaxKeys限定此次返回文件的最大数,如果不设定,默认为100,MaxKeys取值不能大于1000。
Prefix限定返回的文件名称必须以Prefix作为前缀。注意使用Prefix查询时,返回的文件名中仍会包含Prefix。

说明:
  • 完整代码参考GitHub
  • 如果需要遍历所有的文件,而文件数量大于100,则需要进行多次迭代。每次迭代时,将上次迭代列取最后一个文件的key作为本次迭代中的Marker即可。


展开
收起
青衫无名 2017-10-18 15:17:00 1842 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载