| 582 | } |
| 583 | |
| 584 | Status S3FileSystem::RenameFile(const string& src, const string& target) { |
| 585 | string src_bucket, src_object, target_bucket, target_object; |
| 586 | TF_RETURN_IF_ERROR(ParseS3Path(src, false, &src_bucket, &src_object)); |
| 587 | TF_RETURN_IF_ERROR( |
| 588 | ParseS3Path(target, false, &target_bucket, &target_object)); |
| 589 | if (src_object.back() == '/') { |
| 590 | if (target_object.back() != '/') { |
| 591 | target_object.push_back('/'); |
| 592 | } |
| 593 | } else { |
| 594 | if (target_object.back() == '/') { |
| 595 | target_object.pop_back(); |
| 596 | } |
| 597 | } |
| 598 | |
| 599 | Aws::S3::Model::CopyObjectRequest copyObjectRequest; |
| 600 | Aws::S3::Model::DeleteObjectRequest deleteObjectRequest; |
| 601 | |
| 602 | Aws::S3::Model::ListObjectsRequest listObjectsRequest; |
| 603 | listObjectsRequest.WithBucket(src_bucket.c_str()) |
| 604 | .WithPrefix(src_object.c_str()) |
| 605 | .WithMaxKeys(kS3GetChildrenMaxKeys); |
| 606 | listObjectsRequest.SetResponseStreamFactory( |
| 607 | []() { return Aws::New<Aws::StringStream>(kS3FileSystemAllocationTag); }); |
| 608 | |
| 609 | Aws::S3::Model::ListObjectsResult listObjectsResult; |
| 610 | do { |
| 611 | auto listObjectsOutcome = |
| 612 | this->GetS3Client()->ListObjects(listObjectsRequest); |
| 613 | if (!listObjectsOutcome.IsSuccess()) { |
| 614 | return errors::Unknown(listObjectsOutcome.GetError().GetExceptionName(), |
| 615 | ": ", listObjectsOutcome.GetError().GetMessage()); |
| 616 | } |
| 617 | |
| 618 | listObjectsResult = listObjectsOutcome.GetResult(); |
| 619 | for (const auto& object : listObjectsResult.GetContents()) { |
| 620 | Aws::String src_key = object.GetKey(); |
| 621 | Aws::String target_key = src_key; |
| 622 | target_key.replace(0, src_object.length(), target_object.c_str()); |
| 623 | Aws::String source = Aws::String(src_bucket.c_str()) + "/" + |
| 624 | Aws::Utils::StringUtils::URLEncode(src_key.c_str()); |
| 625 | |
| 626 | copyObjectRequest.SetBucket(target_bucket.c_str()); |
| 627 | copyObjectRequest.SetKey(target_key); |
| 628 | copyObjectRequest.SetCopySource(source); |
| 629 | |
| 630 | auto copyObjectOutcome = |
| 631 | this->GetS3Client()->CopyObject(copyObjectRequest); |
| 632 | if (!copyObjectOutcome.IsSuccess()) { |
| 633 | return errors::Unknown(copyObjectOutcome.GetError().GetExceptionName(), |
| 634 | ": ", copyObjectOutcome.GetError().GetMessage()); |
| 635 | } |
| 636 | |
| 637 | deleteObjectRequest.SetBucket(src_bucket.c_str()); |
| 638 | deleteObjectRequest.SetKey(src_key.c_str()); |
| 639 | |
| 640 | auto deleteObjectOutcome = |
| 641 | this->GetS3Client()->DeleteObject(deleteObjectRequest); |