通过ifstream打开文件时如何共享文件删除权限

Min*_*Mun 5 c++ windows winapi file

我想制作一个在打开时可以删除的文件ifstream

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

CreateFile(...,FILE_SHARE_DELETE,...)
Run Code Online (Sandbox Code Playgroud)

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

一打开就删不掉

我没有找到任何关于设置属性的文档,比如FILE_SHARE_DELETEon ifstream

我该怎么做才能解决这个问题?

Rem*_*eau 5

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

不过,还有一种选择。Visual Studio 的版本std::ifstreamstd::ofstream具有接受FILE*文件访问的非标准构造函数。例如,您可以使用 Microsoft和函数将HANDLEfrom包装CreateFile()到 a 中(为简洁起见,已删除错误处理):FILE*_open_osfhandle()_fdopen()

我可以使用 CreateFile,但将句柄强制转换为 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();
Run Code Online (Sandbox Code Playgroud)

如果您需要对非 Microsoft 编译器更便携的东西,您可能不得不求助于编写自定义std::basic_streambuf类(或可能派生自std::filebuf)来包装您的HANDLE,然后将该类的对象std::basic_istream直接传递给构造函数。