我希望能够创建一个文件,在使用ifstream
打开后可以被删除。
我知道在使用Windows API的CreateFile
时很容易实现这一点。
CreateFile(...,FILE_SHARE_DELETE,...)
但是当我使用 ifstream 打开文件进行测试时,它无法被删除。
我没有找到任何关于在 ifstream 上设置类似 FILE_SHARE_DELETE 的属性的文档。
我该如何解决这个问题?
Visual Studio 版本的 std::ifstream
有一个非标准构造函数和一个非标准的 open()
重载,均带有一个额外的可选参数 _Prot
,用于指定“文件保护/共享标志”(有关可用标志的列表,请参见 _fsopen()
)。然而,不支持 "delete" 共享。
不过,这里有个替代方案。Visual Studio 版本的 std::ifstream
和 std::ofstream
都有非标准构造函数,接受一个 FILE*
作为文件访问参数。例如,您可以使用 Microsoft 的 _open_osfhandle()
和 _fdopen()
函数将来自 CreateFile()
的 HANDLE
包装成 FILE*
(出于简洁起见已删除错误处理):
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
构造函数。
整个文件的读、写或删除访问共享
在父目录上具有写入和执行权限。文件本身的权限是无关紧要的
由于Windows是唯一具有删除访问权限的系统,并且已经以CreateFile
with FILE_SHARE_DELETE
的形式提供了自己的访问器,因此没有动机将此功能标准化。
如果此功能对您的程序至关重要,则可以实现此跨平台函数(请注意,根据文件大小,这可能非常昂贵):
fstream
打开文件进行读写;如果失败,则表示该文件已被其他程序锁定,无法删除。ofstream
重新打开文件进行写操作。ofstream
中ofstream
。ofstream
处于打开状态,操作系统就会负责防止更改文件或其所在目录的权限。因此,由于您已经删除了文件,所以当关闭ofstream
时,您仍然可以删除该文件。
FILE
句柄或文件号的ifstream
的方法,这将对应于API级别的句柄。也许。 - Cheers and hth. - AlfGCC
)将即将成为标准的文件系统库作为“技术规范”提供。您可以使用:std::experimental::filesystem::remove。否则,boost
中有相同(或类似)的库。 - GalikFILE_SHARE_DELETE
无关。 - David Heffernan