???????????????????????????????????? 如何通過(guò)FILE*操作內(nèi)存文件
/*
問(wèn)題概述:
? 有這樣一個(gè)第三方的庫(kù)函數(shù)void WriteDataToFile(FILE* pFile),它是向一個(gè)文件寫入數(shù)據(jù)。
? 現(xiàn)在需要通過(guò)函數(shù)WriteDataToFile生成臨時(shí)數(shù)據(jù),但不能生成磁盤文件(需要在內(nèi)存中操作)。
? 然后通過(guò)某種方式讀取內(nèi)存中的數(shù)據(jù)。
流程設(shè)想:
1、
創(chuàng)建一個(gè)內(nèi)存文件
獲取該內(nèi)存文件的FILE*
寫入數(shù)據(jù)
2、
打開(kāi)該內(nèi)存文件
獲取內(nèi)存文件的FILE*
讀取內(nèi)存文件的內(nèi)容
關(guān)閉
3、
關(guān)閉
*********************************************************************************
需要解決的問(wèn)題:
1. 內(nèi)存文件的HANDLE是否可以轉(zhuǎn)換為FILE* (_open_osfhandle不可以)
2. 內(nèi)存文件的操作需要調(diào)用PVOID pView = MapViewOfFile(...); 通過(guò)pView才能更改內(nèi)存文件之內(nèi)容。
?? 通過(guò)FILE* 能否通過(guò)某種方式操作pView的內(nèi)容
3. 需要實(shí)現(xiàn)的函數(shù)(見(jiàn)下面的測(cè)試代碼)
?? FILE* GetFilePtrByMemFileHandle(HANDLE hMemFile)
?? void UpdateMemFile(HANDLE hMemFile)
4. 如果該方案有問(wèn)題,可以更改
**********************************************************************************
實(shí)現(xiàn):
? 1.為了方便測(cè)試使用全局的文件HANDLE
? 2.模擬實(shí)現(xiàn)了WriteDataToFile函數(shù)
? 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
//?模擬庫(kù)函數(shù)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
//具體的實(shí)現(xiàn)
34
35
//
.
36
return?NULL;
37
}
38
void?UpdateMemFile(HANDLE?hMemFile)
39

{
40
//
..
41
//需要實(shí)現(xiàn)
42
}
43
44
void?Test()
45

{
46
//?1?寫內(nèi)存文件
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
?//更新內(nèi)存文件
59
?UpdateMemFile(g_hMemFile);
60
61
//?2?讀內(nèi)存文件
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?關(guān)閉?
78
?CloseHandle(g_hMemFile);
79
}
80
81