如何确定boost :: filesystem :: remove不会尝试删除另一个进程使用的文件?

时间:2019-01-15 09:53:30

标签: c++ amazon-s3 boost boost-filesystem

我想将文件上传到AWS S3存储桶。在执行此操作之前,我从中创建一个.gz文件以减少其存储。上传后,我想使用boost :: filesystem :: remove再次删除.gz文件。

上传似乎阻止了正在上传的文件,我无法找到一种方法来等待完整的结果,因此该文件将不再被锁定。

删除操作与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 operation.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 :(得分:1)

当您尝试删除文件时,您的Aws :: FStream仍处于打开状态。因此,您只需要将其关闭,然后再尝试将其删除。

我认为您可以直接致电

input_data->close();

在删除文件之前。