开发者社区 问答 正文

.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 1866 分享 版权
阿里云 AI 助理回答

您提供的代码示例和说明已经很好地展示了如何使用阿里云的Object Storage Service (OSS) SDK来异步列出存储空间(Bucket)中的文件。这里我再简要概括一下关键点,并提供一些额外的建议:

异步列出文件

  1. 初始化OssClient:首先,需要使用您的Endpoint、AccessKeyId、AccessKeySecret初始化OssClient实例。

  2. 创建ListObjectsRequest:创建一个ListObjectsRequest对象,指定要列出文件的Bucket名称。您可以根据需要设置DelimiterMarkerMaxKeysPrefix等参数来过滤和分页查询文件。

  3. 开始异步操作:通过调用ossClient.BeginListObjects方法开始异步列出文件的操作,并传入请求对象以及回调方法ListObjectCallback。同时,可以使用AutoResetEvent来同步等待操作完成。

  4. 回调方法处理结果:在ListObjectCallback中,通过ossClient.EndListObjects获取到异步操作的结果,并遍历result.ObjectSummaries来打印每个文件的名称。完成后,通过_event.Set()通知等待的主线程。

  5. 迭代处理:如果Bucket中的文件数量超过单次请求的最大限制(默认100,最大1000),您需要检查result.IsTruncated属性来决定是否还有更多文件未列出,并使用result.NextMarker作为下一次请求的Marker继续列出剩余文件。

注意事项

  • 安全性:确保访问密钥(AccessKeyId和AccessKeySecret)的安全管理,避免泄露。
  • 资源管理:在程序结束时,考虑调用ossClient.Dispose()或使用using语句来释放OssClient资源。
  • 错误处理:在实际应用中,应充分考虑异常处理逻辑,确保程序的健壮性。
  • 性能与成本:大量文件的列举操作可能会影响性能和增加请求费用,合理安排查询策略,比如分批处理或按需查询。

以上就是基于阿里云OSS服务异步列出文件的基本流程和注意事项。希望对您有所帮助!

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答