程序通訊之檔案讀寫
阿新 • • 發佈:2019-01-09
檔案也可以用來作為程序通訊的工具,
1.建立 讀取者程式
// InterProcess_Communucation_FILE_READER.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <windows.h> #include <iostream> #include <stdio.h> using namespace std; //約定檔名 #define FILE_NAME TEXT("d:\\tempfile.dat") //約定用於同步傳送端和接收端的事件物件名 #define NOTE_EVENT_NAME TEXT("tempfileEVENT") //獲取用於同步傳送端和接收端的事件物件 HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE,NOTE_EVENT_NAME); VOID RefreshView(HANDLE hFile ) { system("cls"); DWORD dwRet = 0; UINT len = GetFileSize(hFile,NULL); SetFilePointer(hFile,0,NULL,FILE_BEGIN); LPWSTR lpwstr = (LPWSTR)calloc(len,sizeof(char)); if(!ReadFile(hFile,lpwstr,len,&dwRet,NULL)) wcout << L"讀取內容失敗\n"; UINT characters = len / sizeof(WCHAR); for(int i = 0; i < characters-1; i++) { if(lpwstr[i] == 0) lpwstr[i] = L'\n'; } wcout << lpwstr << endl; ResetEvent(hEvent); } BOOL ReadFromFile(WCHAR* lpwstr ) { //wcout的使用需要設定語言環境 setlocale(LC_ALL,"chs"); //獲取 同一主機上傳送端和接受端檔案約定名稱的檔案控制代碼 HANDLE hFile = CreateFile(FILE_NAME,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE) { DWORD dwErr = GetLastError( ); if(dwErr == ERROR_ACCESS_DENIED) //如果錯誤碼是access_denied說明許可權不夠,程式需要執行在管理員提權 情況下, wcout << TEXT("you must elevate you privilege!\n"); wcout << TEXT("Cannot get the file handle! exit\n"); system("pause"); return 0; } while(1) { DWORD dwRet = WaitForSingleObject(hEvent,INFINITE); if(dwRet == WAIT_OBJECT_0) { RefreshView(hFile); } } //實際上是個死迴圈,不可能執行到這裡來,自然也就不用關閉控制代碼了,因為程式結束了,系統會自動釋放程序佔用的所有資源 CloseHandle(hFile); } int _tmain(int argc, _TCHAR* argv[]) { ReadFromFile(FILE_NAME); return 0; }
2.建立寫入者程式
#include "stdafx.h" #include <windows.h> #include <iostream> #include <stdio.h> using namespace std; //約定檔名 #define FILE_NAME TEXT("d:\\tempfile.dat") //約定用於同步傳送端和接收端的事件物件名 #define NOTE_EVENT_NAME TEXT("tempfileEVENT") //用於同步傳送端和接收端的物件 HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE,NOTE_EVENT_NAME); int _tmain(int argc, _TCHAR* argv[]) { //wcout的使用需要設定語言環境 setlocale(LC_ALL,"chs"); //獲取 同一主機上傳送端和接受端檔案約定名稱的檔案控制代碼 HANDLE hFile = CreateFile(FILE_NAME,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE) { DWORD dwErr = GetLastError( ); if(dwErr == ERROR_ACCESS_DENIED) //如果錯誤碼是access_denied說明許可權不夠,程式需要執行在管理員提權 情況下, wcout << TEXT("you must elevate you privilege!\n"); wcout << TEXT("Cannot get the file handle! exit\n"); system("pause"); return 0; } DWORD size = GetFileSize(hFile,NULL); SetFilePointer(hFile,0,NULL,FILE_END); while(1) { wcout << TEXT("\n請輸入字串:") << endl; //每一次迴圈,獲取一行輸入 WCHAR wch[MAX_PATH] = {0}; wcin.getline(wch,MAX_PATH); UINT len = (lstrlen(wch) + 1)*sizeof(WCHAR); DWORD dwRet = 0; if(!WriteFile(hFile,(LPVOID)wch,len,&dwRet,NULL)) { wcout<<TEXT("\nCannot write informatin into the file\n"); } wcout << TEXT("Write information succeed!\n"); wcout << L"\n退出否?y or n:" << endl; WCHAR ch[2] = {0}; wcin.getline(ch,2) ; if(ch[0] == L'y') //輸入小寫y退出 寫入檔案 break; SetEvent(hEvent); } CloseHandle(hFile); return 0; }
實驗截圖(先執行輸入者,再執行讀取者)