如何通过ifstream

时间:2016-08-15 09:02:22

标签: c++ windows file winapi

我想创建ifstream打开时可以删除的文件。

我知道使用Windows API时很容易:CreateFile

CreateFile(...,FILE_SHARE_DELETE,...)

但是当我通过ifstream打开文件进行测试时。

打开时无法删除。

我没有在FILE_SHARE_DELETE上找到任何关于设置属性的文档,例如ifstream

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

Visual Studio的std::ifstream版本有一个非标准构造函数和一个非标准open()重载,它们都有一个额外的可选_Prot参数,用于指定“文件保护/共享标志” (有关可用标志的列表,请参阅_fsopen())。但是,delete共享不是受支持的标志之一。

但是还有另一种选择。 Visual Studio的std::ifstreamstd::ofstream版本都有非标准构造函数,可以接受FILE*文件访问。您可以使用Microsoft的HANDLECreateFile()函数将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构造函数。