在 AWS 中使用 C# 将对象从一个文件夹移动到同一个 S3 存储桶中的另一个文件夹

Amazon S3(简单存储服务)是 Amazon Web Services (AWS) 提供的可扩展存储服务。它被广泛用于随时随地从网络上的任何位置存储和检索任意数量的数据。在本博客中,我们将逐步介绍使用 C# 将文件夹从一个根目录移动到另一个根目录的步骤。

介绍

Amazon S3 旨在让网络规模计算变得更加简单,它允许用户随时随地从网络上的任何位置存储和检索任意数量的数据。它为开发人员和 IT 团队提供安全、耐用、高度可扩展的对象存储。S3 的一些常见用例包括数据备份和还原、灾难恢复、数据存档以及网站和应用程序的内容存储。

关键概念

  • Bucket:Bucket 是 S3 中用于存储对象(文件)的容器。每个 bucket 都有唯一名称,用于存储数据对象。
  • 对象:对象是存储在 S3 中的基本实体,由数据和元数据组成。对象在存储桶内通过键(名称)唯一标识。
  • 键:键是存储桶内对象的唯一标识符。它们可以包含斜杠(“/”)以模拟目录结构,从而允许将对象组织到文件夹中。
  • 在 S3 中移动文件夹:在同一 S3 存储桶内移动文件夹涉及将所有对象从源文件夹复制到目标文件夹,然后删除原始对象。以下是在 C# 中实现此操作的详细步骤和代码片段。
  • 逐步实施

    1.设置适用于 .NET 的 AWS SDK

    确保已安装适用于 .NET 的 AWS SDK。您可以通过 NuGet 包管理器安装它。

    Install-Package AWSSDK.S3

    2.初始化 Amazon S3 客户端

    使用您的 AWS 凭证创建 AmazonS3Client 实例。

    using Amazon.S3;
    using Amazon.S3.Model;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace S3FolderMove
    {
        class Program
        {
            private static readonly string sourceFolder = "source-folder/";
            private static readonly string destinationFolder = "destination-folder/";
            private static readonly string bucketName = "your-bucket-name";
            private static readonly AmazonS3Client s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);
    
            static async Task Main(string[] args)
            {
                await MoveFolderAsync(sourceFolder, destinationFolder);
                Console.WriteLine("Folder moved successfully.");
            }
    
            public static async Task MoveFolderAsync(string sourceFolder, string destinationFolder)
            {
                ListObjectsV2Request listRequest = new ListObjectsV2Request
                {
                    BucketName = bucketName,
                    Prefix = sourceFolder
                };
    
                ListObjectsV2Response listResponse;
                do
                {
                    listResponse = await s3Client.ListObjectsV2Async(listRequest);
    
                    foreach (S3Object s3Object in listResponse.S3Objects)
                    {
                        string sourceKey = s3Object.Key;
                        string destinationKey = destinationFolder + sourceKey.Substring(sourceFolder.Length);
    
                        // Copy the object
                        CopyObjectRequest copyRequest = new CopyObjectRequest
                        {
                            SourceBucket = bucketName,
                            SourceKey = sourceKey,
                            DestinationBucket = bucketName,
                            DestinationKey = destinationKey
                        };
                        await s3Client.CopyObjectAsync(copyRequest);
    
                        // Delete the original object
                        DeleteObjectRequest deleteRequest = new DeleteObjectRequest
                        {
                            BucketName = bucketName,
                            Key = sourceKey
                        };
                        await s3Client.DeleteObjectAsync(deleteRequest);
    
                        Console.WriteLine($"Moved {sourceKey} to {destinationKey}");
                    }
    
                    listRequest.ContinuationToken = listResponse.NextContinuationToken;
                } while (listResponse.IsTruncated);
            }
        }
    }

    代码解释

    Amazon S3 客户端初始化

    private static readonly AmazonS3Client s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);

    这将使用指定的 AWS 区域初始化 S3 客户端。确保您的 AWS 凭证配置正确。

    列出对象

    ListObjectsV2Request listRequest = new ListObjectsV2Request
    {
        BucketName = bucketName,
        Prefix = sourceFolder
    };

    这将创建一个请求以列出源文件夹中的所有对象。

    复制和删除对象

    foreach (S3Object s3Object in listResponse.S3Objects)
    {
        string sourceKey = s3Object.Key;
        string destinationKey = destinationFolder + sourceKey.Substring(sourceFolder.Length);
    
        // Copy the object
        CopyObjectRequest copyRequest = new CopyObjectRequest
        {
            SourceBucket = bucketName,
            SourceKey = sourceKey,
            DestinationBucket = bucketName,
            DestinationKey = destinationKey
        };
        await s3Client.CopyObjectAsync(copyRequest);
    
        // Delete the original object
        DeleteObjectRequest deleteRequest = new DeleteObjectRequest
        {
            BucketName = bucketName,
            Key = sourceKey
        };
        await s3Client.DeleteObjectAsync(deleteRequest);
    }

    此代码将每个对象从源文件夹复制到目标文件夹,然后从源文件夹中删除原始对象。

    结论

    在 S3 存储桶内移动文件夹涉及列出对象、将其复制到新位置以及删除原始对象。使用 AWS SDK for .NET 可使此过程变得简单而高效。使用提供的代码片段,您可以轻松地在 C# 应用程序中实现此功能。

    通过了解和利用 S3 的强大功能,您可以有效地管理和操作数据,确保数据井然有序且易于访问。这种方法对各种用例都有好处,例如数据迁移、重组和归档流程。