能否从std::ofstream(Visual C++ 2005)中获取底层文件HANDLE?
这与以下问题相反:
我可以使用CreateFile,但将句柄强制插入到std::ofstream中吗?
我之所以想这样做是为了修改文件的属性(例如创建时间),而无需使用CreateFile打开该文件。
能否从std::ofstream(Visual C++ 2005)中获取底层文件HANDLE?
这与以下问题相反:
我可以使用CreateFile,但将句柄强制插入到std::ofstream中吗?
我之所以想这样做是为了修改文件的属性(例如创建时间),而无需使用CreateFile打开该文件。
ofstream
的原始文件描述符的方法,因此我认为这是不可能的。但是,可以构建一个自定义的streambuf
类,该类实现了对HANDLE
的流缓冲,然后定义一个使用该缓冲区的自定义ostream
类型。我不确定这是否真正符合您的要求,但这是一个可行的选择。 friend HANDLE __HACK_getFilebufHANDLE(filebuf*);
namespace std {
HANDLE __HACK_getFilebufHANDLE(filebuf*in) {
return (HANDLE) _get_osfhandle(_fileno(in->_Myfile));
}
};
最后,你只需要调用它,除了rdbuf返回错误类型(iobuf而不是filebuf)。既然我们已经在整个过程中处于“这里有巨龙”的状态,那么我们可能会让每个人的皮肤爬满蚂蚁(但在现实生活中,在这里进行类型检查以验证对派生类型的转换):
__HACK_getFilebufHANDLE((filebuf*)fopoutstrm.rdbuf())
很抱歉我没有一个更简洁的答案。
不行。你甚至无法访问std::basic_filebuf
内部的FILE*
(或作为内部名称的_Filet*
)。
在标准的C++中是不可能实现的。但是,使用Boost.IOStreams库并不难。创建一个Device
,将其包装在boost::iostreams::stream_buffer<>
中,并使用boost::iostreams::stream<>
添加适当的流。
使用VisualC++ 2010库,以下代码应该可以工作。我假设对于VisualC++ 2005也是一样的,但你需要进行验证:
FILE* fh = fopen(...);
HANDLE hFile = (HANDLE)_get_osfhandle(_fileno(fh));
// do something on hFile
// create iostream from FILE
std::ifstream ifs(fh);
// use it...
// close FILE
_close(fh);
std::ifstream
没有这样的构造函数。这是一个扩展还是猜测? - GManNickGfopen
和 fclose
。 - QT-1"std::ifstream ifs(fh);"
在一些MSVS中可能无法工作,例如2008。