文件的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}

转载于:https://www.cnblogs.com/wuwuwu/archive/2005/10/14/6335226.html

文件的HANDLE转化为FILE*!!!相关推荐

  1. C/C++文件读写操作总结:FILE*、fstream、windowsAPI

    CFile file;CString FileName = _T("C:\\Users\\zhan\\Desktop\\自写测试数据\\100.txt");file.Open(Fi ...

  2. 【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )

    文章目录 一.修复包 Dex 文件准备 二.Odex 优化 三.Dex 文件拷贝 四. 源码资源 一.修复包 Dex 文件准备 异常代码 : 故意写一个异常代码 , 并执行该代码 , 肯定会崩溃 ; ...

  3. c语言file函数头文件,文件操作函数 C语言 (FILE fputc fgetc fputs fgets fsca...

    在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下: ty ...

  4. JSP中的文件操作:数据流、File类、文件浏览、目录操作、上传下载

    ​ 文件可以永久地存储信息,从本质上讲文件就是存放在盘上的一系列数据的集合.应用程序如果想长期保存数据,就必须将数据存储到文件中,这就涉及到文件的操作.而在编写网站应用程序的过程中,有许多地方要对文件 ...

  5. R语言使用download.file函数下载网络文件到本地(Download File from the Internet)

    R语言使用download.file函数下载网络文件到本地(Download File from the Internet) 目录 R语言使用download.file函数下载网络文件到本地(Down ...

  6. linux存储--文件描述符fd与FILE结构体(二)

    文件描述符fd 对于linux而言,所有对设备(对于linux而言,一切皆文件)和文件的操作都使用文件描述符来进行的. 文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程打开文件的记录表. ...

  7. salt '*' state.highstate 报错找不到文件,环境如下No Top file or master_tops data matches found....

    salt '*' state.highstate 报错找不到文件,环境如下No Top file or master_tops data matches found. file_roots:    b ...

  8. 成功解决 _mssql.c(568): fatal error C1083: 无法打开包括文件: “sqlfront.h”: No such file or directory

    成功解决 _mssql.c(568): fatal error C1083: 无法打开包括文件: "sqlfront.h": No such file or directory 目 ...

  9. 无法打开包括文件:“osgGA/MatrixManipulator”:No such file or directory

    无法打开包括文件:"osgGA/MatrixManipulator":No such file or directory 解决方法: 新版本中已经改名为CameraManipula ...

  10. fatal error C1083: 无法打开包括文件:dxtrans.h: No such file or directory

    From: http://blog.csdn.net/pkueecser/article/details/7287938 fatal error C1083: 无法打开包括文件:"dxtra ...

最新文章

  1. 经典sql语句50题_SQL面试经典50题:带你从建表开始
  2. linux netfilter路由表,Linux netfilter 学习笔记 之十四 netfilter模块会修改数据包关联的路由缓存吗...
  3. C#自定义数字格式字符串
  4. linux内核变更导致的错误及解决方案1
  5. 计算色光叠加的RGB颜色的alpha值
  6. 【转】从事IT行业的应该如何学习最高效的休息方式
  7. iOS性能优化-列表卡顿
  8. 前端切图实战(PSD设计稿转化为前端)
  9. 机房动环监控系统有哪些告警功能,机房动环监控系统是什么?
  10. 资深摄影师眼中,青岛值得一游的景点有哪些?
  11. Excel的选取和函数常用技巧及快捷键(一)
  12. OSAL系统框架专题
  13. 1514_人月神话阅读笔记_20年后的人月神话_上篇
  14. 攻防世界MISC———Dift
  15. Hack The Boo 2022 CTF题目writeups
  16. u8信息服务器,u8服务器的配置
  17. latex 行间公式大小(批量设置)
  18. 广东阶段丰收成定局 国稻种芯·中国水稻节:肇庆鱼塘上首次
  19. 分类器对未见过类别(unseen category)的识别问题
  20. Oracle ERP 报表:类数字格式字符串数据的前置0被截取和被科学计数法表示

热门文章

  1. Python使用matplotlib模块绘制多条折线图、散点图
  2. 长方形旋转html5,HTML5/SVG旋转长方形来得到六边形图案
  3. mysql的数学函数开方_MySQL数学函数简明总结
  4. python des加密文件_python基于pyDes库实现des加密的方法
  5. spark将rdd转为string_SparkCore---RDD依赖
  6. 让木桶没有短板,FISCO BCOS全面推进并行化改造
  7. 【Django 2021年最新版教程20】python for循环遍历queryset
  8. php文章列表源码,抓取文章列表
  9. matlab数字带通滤波器的设计,基于MATLAB的数字带通FIR滤波器设计.doc
  10. 西班牙语dele等级_2020年西班牙语DELE考试时间一览表