我想创建ifstream
打开时可以删除的文件。
我知道使用Windows API时很容易:CreateFile
CreateFile(...,FILE_SHARE_DELETE,...)
但是当我通过ifstream打开文件进行测试时。
打开时无法删除。
我没有在FILE_SHARE_DELETE
上找到任何关于设置属性的文档,例如ifstream
。
我该如何解决这个问题?
答案 0 :(得分:3)
Visual Studio的std::ifstream
版本有一个非标准构造函数和一个非标准open()
重载,它们都有一个额外的可选_Prot
参数,用于指定“文件保护/共享标志” (有关可用标志的列表,请参阅_fsopen()
)。但是,delete
共享不是受支持的标志之一。
但是还有另一种选择。 Visual Studio的std::ifstream
和std::ofstream
版本都有非标准构造函数,可以接受FILE*
文件访问。您可以使用Microsoft的HANDLE
和CreateFile()
函数将FILE*
从_open_osfhandle()
打包到_fdopen()
,例如(为简洁起见,错误处理已删除):
Can I use CreateFile, but force the handle into a std::ofstream?
HANDLE file_handle = CreateFile(...,FILE_SHARE_DELETE,...);
int file_descriptor = _open_osfhandle((intptr_t)file_handle, _O_RDONLY);
FILE* file = _fdopen(file_descriptor, "r");
std::ifstream stream(file);
...
// Closes stream, file, file_descriptor, and file_handle.
stream.close();
如果您需要更便携的非Microsoft编译器,您可能不得不求助于编写自定义std::basic_streambuf
类(或者可能来自std::filebuf
)来包装HANDLE
,然后直接将该类的对象传递给std::basic_istream
构造函数。