기술 비망록의 7

9260 단어 F#vc++
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 대상도 방출됩니다. 다시 귀속을 신청해야 합니다.
 

좋은 웹페이지 즐겨찾기