c # Записать файл на S3, а затем удалить локальный файл - PullRequest
0 голосов
/ 30 мая 2018

Следующая программа извлекает данные из веб-службы, записывает их в CSV, загружает файл на S3 и затем удаляет его.У меня проблема в том, что он не может удалить файл, потому что он говорит «System.IO.IOException:« Процесс не может получить доступ к файлу «file.csv», потому что он используется другим процессом. »Я предполагаю, что он не закончил писать в S3, потому что там его нет.Есть предложения?

Здесь я закрываю файл, загружаю на S3 и пытаюсь удалить.

outputFile.Flush();
outputFile.Close();
AmazonS3Uploader awsfu = new AmazonS3Uploader();
awsfu.UploadFile(outputfilePath, "api-end-point", filenameaws);
System.IO.File.Delete(@outputfilePath);

Ниже приведен код для загрузки на S3

class AmazonS3Uploader
{
    public void UploadFile(string filePath, string bucketName, string keyName)
    {
        var client1 = new AmazonS3Client(Amazon.RegionEndpoint.USEast2);
        Console.WriteLine("s3 writing");
        try
        {
            PutObjectRequest Request = new PutObjectRequest
            {
                BucketName = bucketName,
                Key = keyName,
                FilePath = filePath,
            };

            client1.PutObjectAsync(Request);
        }
        catch (AmazonS3Exception amazonS3Exception)
        {
            if (amazonS3Exception.ErrorCode != null &&
                (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
                ||
                amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
            {
                throw new Exception("Check the provided AWS Credentials.");
            }
            else
            {
                throw new Exception("Error occurred: " + amazonS3Exception.Message);
            }
        }
        //System.IO.File.Delete(@filePath); edit

    }
}

1 Ответ

0 голосов
/ 30 мая 2018

Вы вызываете асинхронный метод и не ожидаете его завершения.

Как указано в документации :

[PutObjectAsync] инициирует асинхронныйвыполнение операции PutObject.

Поскольку вы не ожидаете завершения метода, код продолжает и пытается удалить файл (дважды!), пока файл все еще загружается.

Самый простой способ исправить это - изменить код для использования синхронной версии :

client1.PutObject(Request);
...