`
zyy200411
  • 浏览: 46406 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

技术备忘录之七

阅读更多

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对象也会释放掉,需要重新申请绑定

 

 

分享到:
评论

相关推荐

    技术备忘录之十一

    【标题】:“技术备忘录之十一”主要探讨的是与音频处理相关的技术,可能是关于一个音频引擎的实现或优化。这个备忘录可能涉及到如何在软件中管理和操作音频数据,以及如何利用特定工具来提高音频处理的效率和质量。...

    Android 备忘录源码.rar

    《Android 备忘录应用开发详解》 ...通过以上知识点的学习和实践,开发者可以掌握创建一个功能完备的Android备忘录应用的核心技术。从源码中学习,不仅能够提升编程技能,也能加深对Android系统架构的理解。

    Android程序研发源码Android 备忘录源码.zip

    7. **通知(Notifications)**: 当用户添加新的备忘录或者有重要的提醒时,应用会通过Notification API发送系统通知,确保用户即使不在应用内也能收到信息。 8. **Adapter与ListView/RecyclerView**: 为了显示列表...

    html制作的备忘录html制作的备忘录

    7. **事件处理**:如果这个备忘录应用有添加、删除或修改功能,那么可能使用JavaScript进行交互处理。例如,监听`click`事件在按钮被点击时执行特定功能,使用`addEventListener`来添加事件监听器。 8. **存储和...

    备忘录系统设计

    在提供的“备忘录课程设计.doc”文档中,可能会详细阐述以上各个知识点的具体实现,包括设计思路、技术选型、代码示例等内容,为学习者提供了一个完整的备忘录系统设计案例。通过深入阅读和理解这份文档,可以加深对...

    android 作业 备忘录

    这个"android作业 备忘录"项目可能是为学生或初学者设计的一个实践练习,以便他们更好地理解和掌握Android应用程序开发的基本概念和技术。下面将详细讨论涉及到的相关知识点。 1. **Android Studio**:作为Android...

    手机备忘录程序

    【手机备忘录程序】是一种常见且实用的智能手机应用程序,主要功能是帮助用户记录日常生活、工作中的重要事项或想法,确保不会遗忘待办任务。它通常具有简洁的用户界面和高效的提醒机制,使得用户可以方便地创建、...

    易语言备忘录提醒源码.zip易语言项目例子源码下载

    7. **多线程编程**:如果提醒功能需要在后台运行,可能需要使用多线程技术,确保不影响主界面的正常操作。 8. **代码组织**:易语言项目通常包含多个模块,每个模块负责不同的功能。理解如何合理划分模块和编写清晰...

    代码备忘录(经典的代码备忘录)

    在快速发展的信息技术领域,程序员们经常需要处理大量的代码,为了提高工作效率和代码管理能力,一款优秀的代码备忘录软件是必不可少的。本文将深入探讨“代码备忘录”这一经典工具,揭示其核心功能和优势,并分享...

    C#自制桌面备忘录(自制日历)

    在备忘录软件中,日历是核心功能之一。开发人员需要设计和实现一个自定义的日历控件,用户可以通过该控件查看日期、添加、编辑和删除备忘录。日历控件通常会包含月份切换、日期选择、事件标记等功能,确保用户能直观...

    iOS9备忘录

    - **Touch ID/Face ID集成**: 在原版备忘录中,用户可通过生物识别技术快速解锁查看备忘录。 7. **其他辅助功能** - **提醒与时间戳**: 可以设置备忘录的提醒时间,帮助用户记住重要事项。 - **智能建议**: 原版...

    DELPHI个人备忘录

    5. **多线程与提醒服务**:如果备忘录需要在后台运行并触发提醒,可能需要使用到多线程技术。DELPHI的TThread类可以帮助你创建和管理线程,而TTask或TMemoTask则可以实现异步任务,比如定时检查提醒。 6. **错误...

    安卓备忘录

    【安卓备忘录】是一款专为安卓平台设计的应用程序,其核心功能是提供闹钟提醒与备忘录记录服务。这款应用充分利用了Eclipse这一强大的Java集成开发环境进行开发,展示了Android平台上事件管理与用户界面设计的技术...

    微信小程序项目实例——备忘录

    在本项目实例中,我们探讨的是一个基于微信小程序的备忘录应用。微信小程序是一种轻量级的应用开发平台,特别适合构建无需下载安装即可使用的移动应用。该项目旨在提供记录文字、计时以及设置提醒的基本功能,以满足...

    android备忘录实现

    在Android平台上,开发一个备忘录应用程序涉及到多个关键知识...以上是基于给定的文件名和描述,对Android备忘录应用实现所涉及的关键技术点的详细解释。理解并熟练掌握这些知识点对于成功构建一个备忘录应用至关重要。

    备忘录.NET C#

    以上就是关于“备忘录.NET C#”的相关知识点,从数据库交互到用户界面设计,再到定时提醒功能的实现,涵盖了多个C#开发的核心概念和技术。这个备忘录应用的实现,不仅锻炼了开发者在.NET平台上的实际操作能力,也...

    安卓手机备忘录

    在Android平台上开发手机备忘录应用时,主要涉及以下几个关键技术点: 1. **用户界面(UI)设计**:一个优秀的备忘录应用需要具备直观易用的界面,让用户能够快速添加、查看和编辑备忘。这涉及到布局管理器(如...

    Android备忘录源码

    【Android备忘录源码】是一个适用于Android平台的软件开发项目,主要功能是实现一个备忘录应用。这个源码可以作为一个学习资源,用于Android课程设计或者毕业设计,为开发者提供了一个实际操作的实例,帮助他们理解...

    C#备忘录数据库代码

    在IT行业中,数据库是存储和管理数据的核心工具,而在C#编程环境中,我们可以利用各种数据库技术来构建备忘录应用程序。C#备忘录数据库代码通常涉及到如何在C#中与数据库进行交互,以实现创建、读取、更新和删除...

    winform做的简易备忘录

    7. 用户交互:Winform应用通常会响应用户的各种操作,如点击按钮添加新备忘录、双击列表项查看详细信息等,这些交互都需要通过事件处理程序来实现。 8. 错误处理:良好的错误处理是任何应用的关键部分,备忘录应用...

Global site tag (gtag.js) - Google Analytics