如何确保 boost::filesystem::remove 不会尝试删除另一个进程正在使用的文件?
How to be sure that boost::filesystem::remove does not try to delete a file that is used by another process?
我想将文件上传到 AWS S3 存储桶。在执行此操作之前,我从中创建一个 .gz 文件以减少其存储空间。上传后我想用 boost::filesystem::remove.
再次删除 .gz 文件
似乎上传阻止了正在上传的文件,我无法找到等待完整结果的方法,因此文件不会再被锁定。
删除与 main() 中的不同调用一起工作。在上传调用之后它不起作用并且 boost operations.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);}
有没有办法确保文件在不再被阻止时将被删除?
当您尝试删除文件时,您的 Aws::FStream 仍处于打开状态。所以你只需要在尝试删除它之前关闭它。
我想你可以直接打电话给
input_data->close();
在删除文件之前。
我想将文件上传到 AWS S3 存储桶。在执行此操作之前,我从中创建一个 .gz 文件以减少其存储空间。上传后我想用 boost::filesystem::remove.
再次删除 .gz 文件似乎上传阻止了正在上传的文件,我无法找到等待完整结果的方法,因此文件不会再被锁定。
删除与 main() 中的不同调用一起工作。在上传调用之后它不起作用并且 boost operations.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);}
有没有办法确保文件在不再被阻止时将被删除?
当您尝试删除文件时,您的 Aws::FStream 仍处于打开状态。所以你只需要在尝试删除它之前关闭它。
我想你可以直接打电话给
input_data->close();
在删除文件之前。