1. 程式人生 > >程序通訊之檔案讀寫

程序通訊之檔案讀寫

檔案也可以用來作為程序通訊的工具,

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;
}


實驗截圖(先執行輸入者,再執行讀取者)