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