开发者社区 问答 正文

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


列出目录下的文件和子目录


在 Prefix 和 Delimiter 结合的情况下,可以列出目录下的文件和子目录:

  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. public void ListObjects(string bucketName)
  5. {
  6.     try
  7.     {
  8.         var listObjectsRequest = new ListObjectsRequest(bucketName)
  9.         {
  10.             Prefix = "fun/",
  11.             Delimiter = "/"
  12.         };
  13.         result = client.ListObjects(listObjectsRequest);
  14.         Console.WriteLine("List object succeeded");
  15.         Console.WriteLine("File:");
  16.         foreach (var summary in result.ObjectSummaries)
  17.         {
  18.             Console.WriteLine("Name:{0}", summary.Key);
  19.         }
  20.         Console.WriteLine("Dir:");
  21.         foreach (var prefix in result.CommonPrefixes)
  22.         {
  23.             Console.WriteLine("Name:{0}", prefix);
  24.         }
  25.     }
  26.     catch (Exception ex)
  27.     {
  28.         Console.WriteLine("List object failed. {0}", ex.Message);
  29.     }
  30. }

输出:
  1. List object success
  2. File:
  3. Name:fun/test.jpg
  4. Dir:
  5. Name:fun/movie/

说明:
  • 返回的结果中, ObjectSummaries 的列表中给出的是fun目录下的文件。
  • 而 CommonPrefixs 的列表中给出的是fun目录下的所有子文件夹。可以看出 fun/movie/001.avi 和 fun/movie/007.avi 两个文件并没有被列出来,因为它们属于fun文件夹下的movie目录。


删除文件



删除一个文件

  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. /// <summary>
  5. /// 列出指定存储空间下的特定文件
  6. /// </summary>
  7. /// <param name="bucketName">存储空间的名称</param>
  8. /// <param name="key">文件的名称</param>
  9. public void DeleteObject(string bucketName, string key)
  10. {
  11.     try
  12.     {
  13.         client.DeleteObject(bucketName, key);
  14.         Console.WriteLine("Delete object succeeded");
  15.     }
  16.     catch (Exception ex)
  17.     {
  18.         Console.WriteLine("Delete object failed. {0}", ex.Message);
  19.     }
  20. }

说明: 完整代码参考 GitHub


删除多个文件

  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. /// <summary>
  5. /// 删除指定存储空间中的所有文件
  6. /// </summary>
  7. /// <param name="bucketName">存储空间的名称</param>
  8. public void DeleteObjects(string bucketName)
  9. {
  10.     try
  11.     {
  12.         var keys = new List<string>();
  13.         var listResult = client.ListObjects(bucketName);
  14.         foreach (var summary in listResult.ObjectSummaries)
  15.         {
  16.             keys.Add(summary.Key);
  17.         }
  18.         var request = new DeleteObjectsRequest(bucketName, keys, false);
  19.         client.DeleteObjects(request);
  20.         Console.WriteLine("Delete objects succeeded");
  21.     }
  22.     catch (Exception ex)
  23.     {
  24.         Console.WriteLine("Delete objects failed. {0}", ex.Message);
  25.     }
  26. }

说明: 完整代码参考 GitHub

展开
收起
青衫无名 2017-10-18 15:20:27 1756 分享 版权
阿里云 AI 助理回答

您提供的代码示例很好地展示了如何使用阿里云的Object Storage Service (OSS) SDK来管理存储空间(Bucket)中的文件和目录。这里我为您总结一下这些操作及其说明:

列出目录下的文件和子目录

通过结合PrefixDelimiter参数,您可以模拟在OSS中列出某个“目录”下的所有文件及子目录。注意,OSS是一个基于键-值对的对象存储服务,并没有传统意义上的文件系统目录结构,但可以通过对象键(Key)前缀来模拟目录。

using Aliyun.OSS;

public void ListObjects(string bucketName)
{
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
    var listObjectsRequest = new ListObjectsRequest(bucketName)
    {
        Prefix = "fun/", // 指定前缀,模拟目录路径
        Delimiter = "/"  // 分隔符,用于区分文件和“目录”
    };
    
    var result = client.ListObjects(listObjectsRequest);
    
    Console.WriteLine("List object succeeded");
    Console.WriteLine("File:");
    foreach (var summary in result.ObjectSummaries)
    {
        Console.WriteLine("Name:{0}", summary.Key);
    }
    Console.WriteLine("Dir:");
    foreach (var prefix in result.CommonPrefixes)
    {
        Console.WriteLine("Name:{0}", prefix);
    }
}

删除单个文件

删除指定Bucket中的一个文件,需要提供Bucket名称和文件的Key(即对象的完整路径)。

public void DeleteObject(string bucketName, string key)
{
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
    try
    {
        client.DeleteObject(bucketName, key);
        Console.WriteLine("Delete object succeeded");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Delete object failed. {0}", ex.Message);
    }
}

批量删除文件

如果您需要删除Bucket中的多个文件,可以先列举出所有要删除的文件的Key,然后一次性发送请求删除它们。

public void DeleteObjects(string bucketName)
{
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
    var keys = new List<string>();
    var listResult = client.ListObjects(bucketName);
    
    foreach (var summary in listResult.ObjectSummaries)
    {
        keys.Add(summary.Key);
    }
    
    var request = new DeleteObjectsRequest(bucketName, keys, false);
    client.DeleteObjects(request);
    Console.WriteLine("Delete objects succeeded");
}

请注意,在实际应用中,您需要替换endpointaccessKeyIdaccessKeySecret为您的阿里云账号对应的访问信息。此外,批量删除操作需谨慎执行,确保不会误删重要数据。

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