Как быть уверенным, что boost :: filesystem :: remove не пытается удалить файл, который используется другим процессом? - PullRequest
0 голосов
/ 15 января 2019

Я хочу загрузить файл в корзину AWS S3. Прежде чем сделать это, я создаю файл .gz из него, чтобы уменьшить его хранилище. После загрузки я хочу снова удалить файл .gz с помощью boost :: filesystem :: remove.

Похоже, что загрузка блокирует загружаемый файл, и я не смог найти способ дождаться полного результата, чтобы файл больше не блокировался.

Удаление работает с другим вызовом в main (). Непосредственно после вызова загрузки он не работает и повышает операции. Hpp выдает исключение.

Исключение говорит о том, что файл уже используется другим процессом.

int main(int argc, char *argv[])
{
boost::filesystem::path path{ C:/Development/test.gz };

//deletes the file correctly if called
//boost::filesystem::remove(path); 

//upload file first, then delete it
putObject(path)
}

void putObject(path, s3client)
{
auto input_data = Aws::MakeShared<Aws::FStream>("", path.string(),
std::ios_base::in | std::ios_base::binary);

auto request = Aws::S3::Model::PutObjectRequest();
request.WithBucket("bucketName").WithKey(key);
request.SetBody(input_data);
request.SetMetadata(metadata);

    //upload file to s3 bucket
s3client->PutObject(request);

//throws exception if called - file is in use
boost::filesystem::remove(path);

}

boost operations.hpp, который выдает исключение (строка 664):

inline
// For standardization, if the committee doesn't like "remove", consider  
"eliminate"
bool remove(const path& p)           {return detail::remove(p);}

Можно ли быть уверенным, что файл будет удален, если он больше не заблокирован?

1 Ответ

0 голосов
/ 15 января 2019

Когда вы пытаетесь удалить файл, ваш Aws :: FStream все еще открыт. Поэтому вам просто нужно закрыть его, прежде чем пытаться удалить.

Я думаю, вы можете просто позвонить

input_data->close();

перед удалением файла.

...