I want to copy one folder, with all existing files inside it, to another folder inside AmazonS3's same Bucket.
I can copy one object but what i need is to copy folder, with all files, into another Folder.
I want to copy one folder, with all existing files inside it, to another folder inside AmazonS3's same Bucket.
I can copy one object but what i need is to copy folder, with all files, into another Folder.
Here is the example to copy folder inside AmazonS3 Bucket Which works for me. For more details you can check this link
public bool CopyFolderInsideS3Bucket(string source, string destination)
{
var strippedSource = source;
var strippedDestination = destination;
// process source
if (strippedSource.StartsWith("/"))
strippedSource = strippedSource.Substring(1);
if (strippedSource.EndsWith("/"))
strippedSource = source.Substring(0, strippedSource.Length - 1);
var sourceParts = strippedSource.Split('/');
var sourceBucket = sourceParts[0];
var sourcePrefix = new StringBuilder();
for (var i = 1; i < sourceParts.Length; i++)
{
sourcePrefix.Append(sourceParts[i]);
sourcePrefix.Append("/");
}
// process destination
if (strippedDestination.StartsWith("/"))
strippedDestination = destination.Substring(1);
if (strippedDestination.EndsWith("/"))
strippedDestination = destination.Substring(0, strippedDestination.Length - 1);
var destinationParts = strippedDestination.Split('/');
var destinationBucket = destinationParts[0];
var destinationPrefix = new StringBuilder();
for (var i = 1; i < destinationParts.Length; i++)
{
destinationPrefix.Append(destinationParts[i]);
destinationPrefix.Append("/");
}
var listObjectsResult = client.ListObjects(new ListObjectsRequest(){
BucketName = sourceBucket,
Prefix = sourcePrefix.ToString(),
Delimiter = "/"});
// copy each file
foreach (var file in listObjectsResult.S3Objects)
{
var request = new CopyObjectRequest();
request.SourceBucket = Settings.BucketName;
request.SourceKey = file.Key;
request.DestinationBucket = destinationBucket;
request.DestinationKey = destinationPrefix + file.Key.Substring(sourcePrefix.Length);
request.CannedACL = S3CannedACL.PublicRead;
var response = (CopyObjectResponse)client.CopyObject(request);
}
// copy subfolders
foreach (var folder in listObjectsResult.CommonPrefixes)
{
var actualFolder = folder.Substring(sourcePrefix.Length);
actualFolder = actualFolder.Substring(0, actualFolder.Length - 1);
CopyFolderInsideS3Bucket(strippedSource + "/" + actualFolder, strippedDestination + "/" + actualFolder);
}
return true;
}
You could use S3DirectoryInfo class in the amazon version 3.1.5 .net 3.5 this class copyTo method.
I used the following example C# code to copy from NTFS file path to AmazonS3 with C# .net 3.5 and amazon version 3.1.5:
BasicAWSCredentials basicCredentials = new BasicAWSCredentials("your access key", "your secret key");
AmazonS3Config configurationClient = new AmazonS3Config();
configurationClient.RegionEndpoint = RegionEndpoint.EUCentral1;
try
{
using (AmazonS3Client clientConnection = new AmazonS3Client(basicCredentials, configurationClient))
{
S3DirectoryInfo source = new S3DirectoryInfo(clientConnection, "sourcebucketname", "sourcefolderkey");
S3DirectoryInfo target = new S3DirectoryInfo(clientConnection, "sourcebucketname", "destinationfolderkey");
source.CopyTo(target);
}
}
catch(Exception ex)
{
}