???????????????????????????????????? 如何通過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
*/?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


