代码之家  ›  专栏  ›  技术社区  ›  Steve Folly

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

  •  17
  • Steve Folly  · 技术社区  · 16 年前

    有没有办法利用win32 api中的文件创建标志,例如 FILE_FLAG_DELETE_ON_CLOSE FILE_FLAG_WRITE_THROUGH 如本文所述 http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx ,然后强制该句柄进入std::ofstream?

    到ofstream的接口显然与平台无关;我想强制在“引擎盖下”中进行一些与平台相关的设置。

    2 回复  |  直到 14 年前
        1
  •  25
  •   ChrisN    16 年前

    可以附加一个C++ std::ofstream 到Windows文件句柄。以下代码适用于VS2008:

    HANDLE file_handle = CreateFile(
        file_name, GENERIC_WRITE,
        0, NULL, CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL, NULL);
    
    if (file_handle != INVALID_HANDLE_VALUE) {
        int file_descriptor = _open_osfhandle((intptr_t)file_handle, 0);
    
        if (file_descriptor != -1) {
            FILE* file = _fdopen(file_descriptor, "w");
    
            if (file != NULL) {
                std::ofstream stream(file);
    
                stream << "Hello World\n";
    
                // Closes stream, file, file_descriptor, and file_handle.
                stream.close();
    
                file = NULL;
                file_descriptor = -1;
                file_handle = INVALID_HANDLE_VALUE;
            }
    }
    

    这与 FILE_FLAG_DELETE_ON_CLOSE 但是 FILE_FLAG_WRITE_THROUGH 可能没有所需的效果,因为数据将由 STD:: 对象,而不是直接写入磁盘。当 stream.close() 但是,被调用。

        2
  •  1
  •   Rolf Kristensen Raúl Diego    14 年前

    使用fsopen/fopen时,其中一些标志也可用:

    FILE* pLockFile = _fsopen(tmpfilename.c_str(), "w", _SH_DENYWR );
    if (pLockFile!=NULL
    {
       // Write lock aquired
       ofstream fs(pLockFile);
    }
    

    在这里,我们打开文件,这样在执行刷新时,它会写入(关闭时会被删除):

    FILE* pCommitFile = fopen(tmpfilename.c_str(), "wcD");
    if (pCommitFile!=NULL)
    {
       // Commits when doing flush
       ofstream fs(pCommitFile);
    }