zoukankan      html  css  js  c++  java
  • 文件的HANDLE转化为FILE*!!!

    文件的HANDLE转化为FILE*

    最近在论坛里问了一个关于文件的HANDLE转化为FILE*的问题。没想到C运行库提供了这样的两个函数:_open_osfhandle、 _fdopen。就跟大家分享一下。

    void OSFileToCRTFile()
    {
     HANDLE hFile = CreateFile("c://test.dat", GENERIC_READ | GENERIC_WRITE, 0, NULL,
      OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

     char szText[] = "Hello world!/n";
     DWORD dwWritten;
     WriteFile(hFile, szText, strlen(szText), &dwWritten, NULL);
     
     FILE* pFile = NULL;
     int nHandle = _open_osfhandle((long)hFile, _O_TEXT | _O_APPEND);
     if (nHandle != -1)
      pFile = _fdopen(nHandle, "wt");
     
     if(pFile)
     {
      int n = fputs("write by FILE*!", pFile);
      fflush(pFile);//立即写入文件
      // n == 0
     }
     
     CloseHandle(hFile);
    }

    但用_open_osfhandle函数只能转化物理文件的HANDLE,没法转化内存文件的HANDLE。现在要实现如下功能,不知道如何实现。如果你有答案,那就赶快到CSDN社区这里去领分吧。

    /*
    问题概述:
      有这样一个第三方的库函数void WriteDataToFile(FILE* pFile),它是向一个文件写入数据。
      现在需要通过函数WriteDataToFile生成临时数据,但不能生成磁盘文件(需要在内存中操作)。
      然后通过某种方式读取内存中的数据。

    流程设想:
    1、
    创建一个内存文件
    获取该内存文件的FILE*
    写入数据
    2、
    打开该内存文件
    获取内存文件的FILE*
    读取内存文件的内容
    关闭
    3、
    关闭
    *********************************************************************************
    需要解决的问题:
    1. 内存文件的HANDLE是否可以转换为FILE* (_open_osfhandle不可以)
    2. 内存文件的操作需要调用PVOID pView = MapViewOfFile(...); 通过pView才能更改内存文件之内容。
       通过FILE* 能否通过某种方式操作pView的内容
    3. 需要实现的函数(见下面的测试代码)
       FILE* GetFilePtrByMemFileHandle(HANDLE hMemFile)
       void UpdateMemFile(HANDLE hMemFile)
    4. 如果该方案有问题,可以更改

    **********************************************************************************
    实现:
      1.为了方便测试使用全局的文件HANDLE
      2.模拟实现了WriteDataToFile函数

     1*/
     2#define MF_NAME TEXT("MF_FILE_NAME")
     3#define MF_SIZE 4*1024
     4HANDLE g_hMemFile = NULL;
     5// 模拟库函数WriteDataToFile
     6void WriteDataToFile(FILE* pFile)
     7{
     8   ASSERT(pFile);
     9   fputs("Write by Lib Function!/n", pFile);
    10}

    11
    12BOOL CreateMemFile()
    13{
    14g_hMemFile = CreateFileMapping(INVALID_HANDLE_VALUE, 
    15NULL, PAGE_READWRITE, 0
    16MF_SIZE, MF_NAME);
    17if(g_hMemFile != NULL)
    18{
    19if(GetLastError() == ERROR_ALREADY_EXISTS)
    20{
    21TRACE("STL MapFile already exists.");
    22CloseHandle(g_hMemFile);
    23return FALSE;
    24}

    25return TRUE;
    26}

    27return FALSE;
    28}

    29
    30FILE* GetFilePtrByMemFileHandle(HANDLE hMemFile)
    31{
    32//.
    33//具体的实现
    34
    35//.
    36return NULL;
    37}

    38void UpdateMemFile(HANDLE hMemFile)
    39{
    40//..
    41//需要实现
    42}

    43
    44void Test()
    45{
    46// 1 写内存文件
    47if(CreateMemFile() == FALSE)
    48return;
    49
    50     FILE* pFile = GetFilePtrByMemFileHandle(g_hMemFile);
    51 if(NULL == pFile)
    52 {
    53 CloseHandle(g_hMemFile);
    54 return;
    55 }

    56
    57 WriteDataToFile(pFile);
    58 //更新内存文件
    59 UpdateMemFile(g_hMemFile);
    60
    61// 2 读内存文件
    62 HANDLE hFile = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, MF_NAME);
    63 if(hFile != NULL)
    64 {
    65 FILE* pReadFile = GetFilePtrByMemFileHandle(hFile);
    66 if(pReadFile)
    67 {
    68 char strBuffer[BUFSIZ];
    69            int nPtCount = 0;
    70            while(fgets(strBuffer, BUFSIZ, pReadFile) != NULL)
    71{
    72TRACE(strBuffer);
    73}

    74 }

    75 CloseHandle(hFile);
    76 }

    77// 3 关闭 
    78 CloseHandle(g_hMemFile);
    79}
  • 相关阅读:
    java socket HTTPClient GET
    Spring的JdbcTemplate使用update或insert操作的三种使用例子
    windows XP 解决QQ和360软件冲突的办法
    J2EE 应用服务器集群常用方法
    javaeye被关闭了 被政 府和谐感
    P6SPY(JDBC SQL拦截)的安装和使用
    让QQ与360并存,不卸载360正常使用QQ
    Spring2.5注解(标注)学习笔记(使用annotation代替XML)
    centos vnc配置
    HTTP协议内容具体含义
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333155.html
Copyright © 2011-2022 走看看