从std :: ofstream获取一个句柄

mpi*_*pe3 5 c++ winapi

是否可以从std :: ofstream(Visual C ++ 2005)获取基础文件HANDLE?

这与这个问题相反:

我可以使用CreateFile,但将句柄强制为std :: ofstream吗?

我想要这样做的原因是修改文件的属性(例如创建时间),而不必使用CreateFile打开文件。

tem*_*def 5

C ++标准没有提供任何手段来指定或检索的原始文件描述符ofstream,因此我认为这是不可能的。什么可能的,但是,将是建立一个自定义streambuf类,它实现流缓冲和从HANDLE,然后定义自定义ostream类型使用该缓冲区。我不确定这是否是您真正要寻找的东西,但这是一个可行的选择。


小智 5

我的回答应该以“我是 Unix 开发人员,而不是 Windows 开发人员”作为开头。但我遇到了和你一样的问题,这就是我选择解决它的方式。我很想有一个更好的答案。我下面的回答会让你起鸡皮疙瘩,但它确实有效。

首先,我们需要 fdbuf 中的 _Filet*。这是一个私有成员,因此我们不能只创建一个新类来让我们了解它。因此,我修改了 fstream 的标头,在 filebuf 中添加了一个新的友元函数,这样特定的函数就可以让我们作弊并访问该成员(我将其添加到定义“_Filet *_Myfile;”的正下方):

 friend HANDLE __HACK_getFilebufHANDLE(filebuf*);
Run Code Online (Sandbox Code Playgroud)

现在我们有一个公共函数来访问私有成员。第二步,编写函数:

namespace std {
   HANDLE __HACK_getFilebufHANDLE(filebuf*in) {
      return (HANDLE) _get_osfhandle(_fileno(in->_Myfile));
   }
};
Run Code Online (Sandbox Code Playgroud)

最后,您只需要调用它,除了 rdbuf 返回错误的类型(iobuf 而不是 filebuf)。由于我们已经在整个过程中“这里有龙”,我们不妨让每个人都感到毛骨悚然(但在现实生活中,在这里进行类型检查以验证派生类型的转换):

  __HACK_getFilebufHANDLE((filebuf*)fopoutstrm.rdbuf())
Run Code Online (Sandbox Code Playgroud)

抱歉,我没有更清晰的答案。