???????????????????????????????????? 如何通過FILE*操作內存文件
/*
問題概述:
? 有這樣一個第三方的庫函數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函數
? 3.已有資料http://community.csdn.net/Expert/TopicView.asp?id=4317083
?1
*/
?2
#define?MF_NAME?TEXT("MF_FILE_NAME")
?3
#define?MF_SIZE?4*1024
?4
HANDLE?g_hMemFile?=?NULL;
?5
//?模擬庫函數WriteDataToFile
?6
void?WriteDataToFile(FILE*?pFile)
?7

{
?8
???ASSERT(pFile);
?9
???fputs("Write?by?Lib?Function!\n",?pFile);
10
}
11
12
BOOL?CreateMemFile()
13

{
14
g_hMemFile?=?CreateFileMapping(INVALID_HANDLE_VALUE,?
15
NULL,?PAGE_READWRITE,?0,?
16
MF_SIZE,?MF_NAME);
17
if(g_hMemFile?!=?NULL)
18

{
19
if(GetLastError()?==?ERROR_ALREADY_EXISTS)
20

{
21
TRACE("STL?MapFile?already?exists.");
22
CloseHandle(g_hMemFile);
23
return?FALSE;
24
}
25
return?TRUE;
26
}
27
return?FALSE;
28
}
29
30
FILE*?GetFilePtrByMemFileHandle(HANDLE?hMemFile)
31

{
32
//
.
33
//具體的實現
34
35
//
.
36
return?NULL;
37
}
38
void?UpdateMemFile(HANDLE?hMemFile)
39

{
40
//
..
41
//需要實現
42
}
43
44
void?Test()
45

{
46
//?1?寫內存文件
47
if(CreateMemFile()?==?FALSE)
48
return;
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

{
72
TRACE(strBuffer);
73
}
74
?}
75
?CloseHandle(hFile);
76
?}
77
//?3?關閉?
78
?CloseHandle(g_hMemFile);
79
}
80
81