技术备忘录之七

2009-08-07

 

VC中文件读写

今天花了几个小时写了一个文件的封装类CFileUtils,能够实现多级目录的创建,.ini文件的读写以及其它文件的读写,赶紧把代码贴出来备忘一下

 

头文件FileUtils.h

// FileUtils.h: interface for the CFileUtils class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_FILEUTILS_H__91C8D3E0_39CD_449F_878B_BC7DEBF8D74B__INCLUDED_)
#define AFX_FILEUTILS_H__91C8D3E0_39CD_449F_878B_BC7DEBF8D74B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

const CString CONFIGFILEDIR = "config";
const CString DATAFILEDIR = "data";
const CString CONFIGFILETYPE = ".ini";
const CString DATAFILETYPE = ".dat";
const CString CONFIGFILENAME = "System";
const CString CONFIG_SECTION_SYSBASE = "SysBase";
const CString CONFIG_SECTION_MERGER = "Merger";

class CFileUtils  
{
public:
	CFileUtils();
	virtual ~CFileUtils();
	//common
	//字符串分割
	void Split(CString str, CStringList & strList, const CString & divideCode, const CString & notIncCode); 
	// 判断目录是否存在
	BOOL FolderExists(LPCSTR lpPathName);
	//创建目录
	BOOL CreateDir(LPCSTR lpPathName);
	//config
	BOOL WriteConfigfileInt(LPCSTR lpAppName, LPCSTR lpKeyName, INT lpInt, LPCSTR lpFileName);
	UINT GetConfigfileInt(LPCSTR lpAppName, LPCSTR lpKeyName, INT nDefault, LPCSTR lpFileName);
	BOOL WriteConfigfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName);
	DWORD GetConfigfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName);
	
	//data
	BOOL WriteDatafile(LPCSTR lpFileName);
	BOOL ReadDatafile(LPCSTR lpFileName);
	BOOL WriteDatafileData(LPVOID lpData, UINT dataSize);
	BOOL ReadDatafileData(LPVOID lpData,UINT dataSize);
	void CloseDatafile();

private:
	//common
	CString m_currentDirectory;
		
	//config
	
	//data
	CFile * m_DATA_file;
	CArchive * m_DATA_archive;
	
};

#endif // !defined(AFX_FILEUTILS_H__91C8D3E0_39CD_449F_878B_BC7DEBF8D74B__INCLUDED_)

 

 FileUtils.cpp

// FileUtils.cpp: implementation of the CFileUtils class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FileUtils.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFileUtils::CFileUtils()
{
	char strBuff[256];
	m_currentDirectory = GetCurrentDirectory(256,strBuff);   //获取当前路径
	m_currentDirectory.Format("%s",strBuff);
	m_DATA_archive = NULL;
	m_DATA_file = NULL;
}

CFileUtils::~CFileUtils()
{
	CloseDatafile();
}

BOOL CFileUtils::WriteConfigfileInt( LPCSTR lpAppName, LPCSTR lpKeyName, INT lpInt, LPCSTR lpFileName )
{
	CreateDir(lpFileName);
	CString lpString;
	lpString.Format("%d",lpInt);
	CString sFileName = m_currentDirectory + lpFileName;
	return ::WritePrivateProfileString(lpAppName,lpKeyName,lpString,sFileName);   //写入ini文件中相应字段
}

UINT CFileUtils::GetConfigfileInt( LPCSTR lpAppName, LPCSTR lpKeyName, INT nDefault, LPCSTR lpFileName )
{
	CString sFileName = m_currentDirectory + lpFileName;
	return ::GetPrivateProfileInt(lpAppName,lpKeyName,nDefault,sFileName);
}

BOOL CFileUtils::WriteConfigfileString( LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName )
{
	CString sFileName = m_currentDirectory + lpFileName;
	return ::WritePrivateProfileString(lpAppName,lpKeyName,lpString,sFileName);
}

DWORD CFileUtils::GetConfigfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName)
{
	CString sFileName = m_currentDirectory + lpFileName;
	return ::GetPrivateProfileString(lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,sFileName);
}

BOOL CFileUtils::WriteDatafile( LPCSTR lpFileName )
{
	CreateDir(lpFileName);
	CString sFileName = m_currentDirectory + lpFileName;
	m_DATA_file = new CFile(sFileName,CFile::modeCreate | CFile::modeWrite);
	m_DATA_archive = new CArchive(m_DATA_file,CArchive::store);
	return TRUE;
}

BOOL CFileUtils::ReadDatafile( LPCSTR lpFileName )
{
	CString sFileName = m_currentDirectory + lpFileName;
	m_DATA_file = new CFile(sFileName,CFile::modeRead);
	m_DATA_archive = new CArchive(m_DATA_file,CArchive::load);
	return TRUE;
}

BOOL CFileUtils::WriteDatafileData( LPVOID lpData, UINT dataSize)
{
	m_DATA_archive->Write(lpData,dataSize);
	m_DATA_archive->Flush();
	return TRUE;
}

BOOL CFileUtils::ReadDatafileData( LPVOID lpData, UINT dataSize )
{
	m_DATA_archive->Read(lpData,dataSize);
	return TRUE;
}

void CFileUtils::CloseDatafile()
{
	if(m_DATA_archive)
	{
		m_DATA_archive->Flush();
		m_DATA_archive->Close();
		m_DATA_file->Close();
		delete m_DATA_archive;
		delete m_DATA_file;
		m_DATA_archive = NULL;
		m_DATA_file = NULL;
	} 
}

BOOL CFileUtils::CreateDir( LPCSTR lpPathName )
{
	CStringList sDirNameList;
	CString sSeparator = "\\";
	CString notIncCode = ".";
	CString sDirName;
	CString sPathName;
	BOOL bNeedJudge = TRUE;
	
	Split(lpPathName,sDirNameList,sSeparator,notIncCode);
	
	if (!sDirNameList.IsEmpty())
	{
		sPathName = m_currentDirectory;
		POSITION pos = sDirNameList.GetHeadPosition();
		while(pos != NULL)
		{
			sDirName = sDirNameList.GetNext(pos);
			sPathName += sSeparator + sDirName;
			if (bNeedJudge)
			{
				if (FolderExists(sPathName))
				{
					continue;
				}
				bNeedJudge = FALSE;
			}
			CreateDirectory(sPathName,NULL);			
		}
		return TRUE;
	}	

	return FALSE;
	
}

BOOL CFileUtils::FolderExists( LPCSTR lpPathName )
{
	DWORD attr; 
    attr = GetFileAttributes(lpPathName); 
    return (attr != (DWORD)(-1) ) && (attr & FILE_ATTRIBUTE_DIRECTORY); 
}

void CFileUtils::Split(CString str, CStringList & strList, const CString & divideCode, const CString & notIncCode)
{
	CString strValue; 
	strList.RemoveAll();
	while (true) 
	{ 
		strValue = str.SpanExcluding(divideCode); 
		if ((strValue != "") && (strValue.Find(notIncCode) == -1))
		{
			strList.AddTail(strValue); 		
		}
		str = str.Right(str.GetLength() - strValue.GetLength() - 1); 
		if (str.IsEmpty()) 
			break; 
	} 
}

 

 调用示例:

CFileUtils * pFileUtils = new CFileUtils;
	
CString str;  
int iInt;
CString sFileName;
char strBuff[256];
	
sFileName = "\\" + CONFIGFILEDIR + "\\" + CONFIGFILENAME + CONFIGFILETYPE;
pFileUtils->WriteConfigfileString("Section","Item1","testString",sFileName);
pFileUtils->WriteConfigfileInt("Section","Item2",1,sFileName);
	
pFileUtils->GetConfigfileString("Section","Item1",NULL,strBuff,100,sFileName);
MessageBox(strBuff);//显示读取数据
iInt = pFileUtils->GetConfigfileInt("Section","Item2",0,sFileName);
str.Format("%d",iInt);
MessageBox(str);//显示读取数据

int i=333;
float f=1.3333f;
char ch='v';
int i1;
float f1;
char ch1;
sFileName = "\\" + DATAFILEDIR + "\\" + "test" + DATAFILETYPE;
pFileUtils->WriteDatafile(sFileName);
pFileUtils->WriteDatafileData(&i,sizeof(int));
pFileUtils->WriteDatafileData(&f,sizeof(float));
pFileUtils->WriteDatafileData(&ch,sizeof(char));
pFileUtils->CloseDatafile();  // 读写完毕后需要关闭

pFileUtils->ReadDatafile(sFileName);
pFileUtils->ReadDatafileData(&i1,sizeof(int));
pFileUtils->ReadDatafileData(&f1,sizeof(float));
pFileUtils->ReadDatafileData(&ch1,sizeof(char));
pFileUtils->CloseDatafile();

str.Format("%d,%f,%c",i1,f1,ch1);//格式化输出数据
MessageBox(str);//显示读取数据	

delete pFileUtils;

 

 

CArchive与CFile是绑定的,如果CFile对象释放,相应的CArchive对象也会释放掉,需要重新申请绑定

 

 

你可能感兴趣的:(F#,vc++)