采用win32函数对文件的基本操作

13 篇文章 0 订阅
10 篇文章 0 订阅

写了个win32函数对文件操作的程序,这里记录一下。


FileHandle.h

#pragma once

#define MAX_RECORD		100
typedef struct _PhoneRecord
{
	char id[4];						// id
	char name[16];					// name
	char phoneNumber[20];			// 电话号码
	unsigned short int state;		// 电话状态(0未接、1已接、2已拨)
	char oTime[20];					// 发生时间
	char usedTime[8];				// 通话时长
	char other[32];					// 扩展用
}PhoneRecord;
#define FILE_NAME	_T("record.log")

class CFileHandle
{
public:
	CFileHandle(void);
	virtual ~CFileHandle(void);
	CString FileName;									// 文件名称
	BOOL CreateARecord(PhoneRecord record);				// 新增一条记录
	BOOL DeteleARecord(char* id);						// 删除一条记录
	BOOL DeteleARecord(int n);							// 删除第n条记录
	BOOL DeleteAllRecords();							// 删除所有记录
	BOOL ModifyARecord(char* id, PhoneRecord record);	// 修改一条记录
	BOOL ModifyARecord(int n, PhoneRecord record);		// 修改第n条记录
	BOOL ReadARecord(PhoneRecord& record);				// 读取一条记录
	BOOL ReadARecord(int n, PhoneRecord& record);		// 读取第n条记录
	BOOL CString2Char(CString str, char* buf, int bufInLen, int& bufOutLen);	// CString转char*
	BOOL Char2CString(char* buf, int bufLen, CString& str);						// char*转CString
	BOOL GetRecordCount(DWORD& size);					// 获取record总条数
	BOOL FindAEmptyRecord(char* id);					// 找出最近一条空记录(以phoneNumber为空判断为空记录)
	BOOL InsertARecord(PhoneRecord record);				// 插入一条新记录到文件中(插入到空的record中,无空record则新增一条)
};

FileHandle.cpp

#include "StdAfx.h"
#include "FileHandle.h"

CFileHandle::CFileHandle(void)
{
}

CFileHandle::~CFileHandle(void)
{
}

//********************************************************************
// Function		:	CreateARecord
// Description	:	新增一条记录
// Input		:	record	: PhoneRecord结构体
// Output		:	NONE
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::CreateARecord(PhoneRecord record)
{
	// CreateFile
	HANDLE hFile = CreateFile(FILE_NAME, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hFile == INVALID_HANDLE_VALUE){
		//MessageBox(L"创建test.txt文件失败");
		::OutputDebugStringW(L"--- CreateARecord create file fail ---\r\n");
		return FALSE;
	}
	// point to file end
	//BOOL ok = SetEndOfFile(hFile);
	DWORD point = SetFilePointer(hFile, 0, 0, FILE_END);
	/*if(!point){
		::OutputDebugStringW(L"--- CreateARecord point to file end fail ---\r\n");
		return FALSE;
	}*/
	// WriteFile
	DWORD dwWritenSize = 0;
	BOOL ok = WriteFile(hFile, &record, sizeof(record), &dwWritenSize, NULL);
	if(ok){
		// flush the data to file
		ok = FlushFileBuffers(hFile);
		//AfxMessageBox(L"写入文件成功");
	}
	else{
		//MessageBoxW(NULL, L"写入文件失败", L"提示", 0);
		::OutputDebugStringW(L"--- CreateARecord write a new record to file fail ---\r\n");
	}
	CloseHandle(hFile);
	hFile = INVALID_HANDLE_VALUE;

	return ok;
}

//********************************************************************
// Function		:	DeteleARecord
// Description	:	删除一条记录,删除后的记录只有id值存在,其他为空。只要电话号码为空则为空记录
// Input		:	id	: n的取值大于等于0
// Output		:	NONE
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::DeteleARecord(char *id)
{
	if(id == NULL)	return FALSE;
	PhoneRecord record;
	memset(&record, 0, sizeof(record));
	memcpy(record.id, id, strlen(id));
	BOOL ok = ModifyARecord(id, record);

	return true;
}

//********************************************************************
// Function		:	DeteleARecord
// Description	:	删除第n条记录,删除后的记录只有id值存在,其他为空。只要电话号码为空则为空记录
// Input		:	id	: n的取值大于等于0
// Output		:	NONE
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::DeteleARecord(int n)
{
	if(n < 0)	return FALSE;
	PhoneRecord record;
	memset(&record, 0, sizeof(record));
	// int to char
	char *p = itoa(n, record.id, 10);
	if(p == NULL)	return FALSE;
	BOOL ok = ModifyARecord(n, record);

	return true;
}

//********************************************************************
// Function		:	DeleteAllRecords
// Description	:	删除所有记录
// Input		:	NONE
// Output		:	NONE
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::DeleteAllRecords()
{
	// CreateFile
	HANDLE hFile = CreateFile(FILE_NAME, GENERIC_WRITE, 0, NULL, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hFile == INVALID_HANDLE_VALUE){
		::OutputDebugStringW(L"--- DeleteAllRecords create file fail ---\r\n");
		return FALSE;
	}
	CloseHandle(hFile);
	hFile = INVALID_HANDLE_VALUE;

	return TRUE;
}

//********************************************************************
// Function		:	ModifyARecord
// Description	:	修改一条记录
// Input		:	id	: n的取值大于等于0
// Input		:	record	: PhoneRecord结构体
// Output		:	NONE
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::ModifyARecord(char *id, PhoneRecord record)
{
	// get file record size
	DWORD dwSize;
	BOOL ok = GetRecordCount(dwSize);
	if(!ok)	return FALSE;

	// read a record
	PhoneRecord recordT;
	for(unsigned int i=0; i<dwSize; i++){
		memset(&recordT, 0, sizeof(recordT));
		ok = ReadARecord(i, recordT);
		if(!ok)	break;
		// write to file
		if(strcmp(recordT.id, id) == 0){
			// CreateFile
			HANDLE hFile = CreateFile(FILE_NAME, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
			if(hFile == INVALID_HANDLE_VALUE){
				::OutputDebugStringW(L"--- ModifyARecord create file fail ---\r\n");
				return FALSE;
			}
			// point to the No.i record
			DWORD point = SetFilePointer(hFile, i*sizeof(record), 0, FILE_BEGIN);
			// WriteFile
			DWORD dwWritenSize = 0;
			ok = WriteFile(hFile, &record, sizeof(record), &dwWritenSize, NULL);
			if(ok){
				// flush the data to file
				ok = FlushFileBuffers(hFile);
			}
			else{
				::OutputDebugStringW(L"--- ModifyARecord write a new record to file fail ---\r\n");
			}
			CloseHandle(hFile);
			hFile = INVALID_HANDLE_VALUE;
			return ok;
		}
	}

	return FALSE;
}

//********************************************************************
// Function		:	ModifyARecord
// Description	:	修改第n条记录
// Input		:	n	: n的取值大于等于0
// Input		:	record	: PhoneRecord结构体
// Output		:	NONE
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::ModifyARecord(int n, PhoneRecord record)
{
	if(n < 0)	return FALSE;
	// get file record size
	DWORD dwSize;
	BOOL ok = GetRecordCount(dwSize);
	if(!ok)	return FALSE;
	if(n >= dwSize)	return FALSE;

	// CreateFile
	HANDLE hFile = CreateFile(FILE_NAME, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hFile == INVALID_HANDLE_VALUE){
		::OutputDebugStringW(L"--- ModifyARecord create file fail ---\r\n");
		return FALSE;
	}
	// point to the No.i record
	DWORD point = SetFilePointer(hFile, n*sizeof(record), 0, FILE_BEGIN);
	// WriteFile
	DWORD dwWritenSize = 0;
	ok = WriteFile(hFile, &record, sizeof(record), &dwWritenSize, NULL);
	if(ok){
		// flush the data to file
		ok = FlushFileBuffers(hFile);
	}
	else{
		::OutputDebugStringW(L"--- ModifyARecord write a new record to file fail ---\r\n");
	}
	CloseHandle(hFile);
	hFile = INVALID_HANDLE_VALUE;

	return TRUE;
}

//********************************************************************
// Function		:	ReadARecord
// Description	:	读取一条记录
// Input		:	NONE
// Output		:	record	: PhoneRecord结构体
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::ReadARecord(PhoneRecord &record)
{
	// CreateFile
	HANDLE hFile = CreateFile(FILE_NAME, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hFile == INVALID_HANDLE_VALUE){
		//MessageBox(L"创建test.txt文件失败");
		::OutputDebugStringW(L"--- ReadARecord create file fail ---\r\n");
		return FALSE;
	}
	int size = sizeof(record);
	memset(&record, 0, size);
	DWORD dwReadSize = 0;
	// ReadFile
	BOOL ok = ReadFile(hFile, &record, size, &dwReadSize, NULL);
	CloseHandle(hFile);

	return ok;
}

//********************************************************************
// Function		:	ReadARecord
// Description	:	读取第n条记录
// Input		:	NONE
// Output		:	record	: PhoneRecord结构体
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::ReadARecord(int n, PhoneRecord &record)
{
	if(n<0)	return FALSE;
	// CreateFile
	HANDLE hFile = CreateFile(FILE_NAME, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hFile == INVALID_HANDLE_VALUE){
		//MessageBox(L"创建test.txt文件失败");
		::OutputDebugStringW(L"--- ReadARecord create file fail ---\r\n");
		return FALSE;
	}
	int size = sizeof(record);
	memset(&record, 0, size);
	DWORD dwReadSize = 0;
	// point to No.n record
	DWORD point = SetFilePointer(hFile, n*size, 0, FILE_BEGIN);
	/*if(!point){
		::OutputDebugStringW(L"--- ReadARecord point to No.n record fail ---\r\n");
		return FALSE;
	}*/
	// ReadFile
	BOOL ok = ReadFile(hFile, &record, size, &dwReadSize, NULL);
	CloseHandle(hFile);

	return ok;
}

//********************************************************************
// Function		:	CString2Char
// Description	:	CString转char*
// Input		:	str	: CString类型字符串,可含中英文
// Input		:	bufInLen	: buf的size大小
// Output		:	buf	: char类型字符串
// Output		:	bufOutLen	: 实际读取字符串的长度
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::CString2Char(CString str, char *buf, int bufInLen, int& bufOutLen)
{
	if(str.IsEmpty() || buf == NULL || bufInLen<=0)	return FALSE;
	// CString to WCHAR
	WCHAR *wch = (WCHAR*)str.GetBuffer(str.GetLength());
	memset(buf, 0, bufInLen);
	// WCHRA to char
	WideCharToMultiByte( CP_ACP, 0, wch, -1, buf, bufInLen, NULL, NULL );
	// get str length, this will cout the string length which can include chinese and english
	bufOutLen = 0;
	for(int i=0; i<str.GetLength(); i++){
		WCHAR data = str.GetAt(i);
		if(data > 0x80){
			bufOutLen += 2;
		}
		else{
			bufOutLen++;
		}
	}

	return TRUE;
}

//********************************************************************
// Function		:	Char2CString
// Description	:	char*转CString
// Input		:	buf	: char类型字符串
// Input		:	bufLen	: buf的长度
// Output		:	str	: CString类型字符串
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::Char2CString(char *buf, int bufLen, CString &str)
{
	if(buf == NULL || bufLen<=0)	return FALSE;

	// char to WCHAR
	WCHAR* wch = new WCHAR(bufLen);
	memset(wch, 0, sizeof(wch));
	MultiByteToWideChar( CP_ACP, 0, buf, bufLen, wch, bufLen/sizeof(WCHAR) );
	str = L"";
	// WCHAR to CString
	for(unsigned int i=0; i<wcslen(wch); i++)
		str.AppendChar(wch[i]);

	return TRUE;
}

//********************************************************************
// Function		:	CreateARecord
// Description	:	新增一条记录
// Input		:	record	: PhoneRecord结构体
// Output		:	NONE
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::GetRecordCount(DWORD &size)
{
	// CreateFile
	HANDLE hFile = CreateFile(FILE_NAME, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hFile == INVALID_HANDLE_VALUE){
		::OutputDebugStringW(L"--- GetRecordCount create file fail ---\r\n");
		size = 0;
		return FALSE;
	}
	// get file size
	DWORD dwSize = GetFileSize(hFile, NULL);
	CloseHandle(hFile);
	size = dwSize/sizeof(PhoneRecord);

	return TRUE;
}

//********************************************************************
// Function		:	FindAEmptyRecord
// Description	:	找出最近一条空记录(以phoneNumber为空判断为空记录)
// Input		:	NONE
// Output		:	id	: n的取值大于等于0
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::FindAEmptyRecord(char* id)
{
	if(id == NULL)	return FALSE;
	BOOL ret = FALSE;
	// CreateFile
	HANDLE hFile = CreateFile(FILE_NAME, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hFile == INVALID_HANDLE_VALUE){
		//MessageBox(L"创建test.txt文件失败");
		::OutputDebugStringW(L"--- ReadARecord create file fail ---\r\n");
		return FALSE;
	}
	// get file size
	DWORD dwSize = GetFileSize(hFile, NULL);
	if(dwSize <= 0){
		CloseHandle(hFile);
		hFile = INVALID_HANDLE_VALUE;
		return FALSE;
	}
	// read a record
	PhoneRecord recordT;
	DWORD dwReadSize = 0;
	for(unsigned int i=0; i<dwSize; i++){
		memset(&recordT, 0, sizeof(recordT));
		// ReadFile
		BOOL ok = ReadFile(hFile, &recordT, sizeof(recordT), &dwReadSize, NULL);
		if(!ok)	break;
		char t_id[4] = "";
		char *p = itoa(i, t_id, 10);
		if(p == NULL)	break;
		// query which record has a empty phoneNumber
		if(strcmp(recordT.id, t_id) == 0){
			if(strlen(recordT.phoneNumber)==0){
				memcpy(id, recordT.id, sizeof(recordT.id));
				ret = TRUE;
				break;
			}
		}
	}
	CloseHandle(hFile);
	hFile = INVALID_HANDLE_VALUE;

	return ret;
}

//********************************************************************
// Function		:	InsertARecord
// Description	:	插入一条新记录到文件中(插入到空的record中,无空record则新增一条)
// Input		:	record	: PhoneRecord结构体
// Output		:	NONE
// return		:	TRUE/FALSE
//********************************************************************
BOOL CFileHandle::InsertARecord(PhoneRecord record)
{
	// find empty record
	memset(record.id, 0, sizeof(record.id));
	BOOL ok = FindAEmptyRecord(record.id);
	if(ok){// do insert
		ok = ModifyARecord(record.id, record);
	}
	else{// do create
		// get how many records
		DWORD dwSize=0;
		ok = GetRecordCount(dwSize);
		// char to int
		char *p = itoa(dwSize, record.id, 10);
		if(p == NULL)	return FALSE;
		// create a record
		ok = CreateARecord(record);
	}

	return ok;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值