fileexamappui.cpp

来自「国内著名嵌入式培训机构内部资料,内含一些实例代码,包括技术专题书籍」· C++ 代码 · 共 536 行

CPP
536
字号
/*
 ============================================================================
 Name		: FileExamAppUi.cpp
 Author	  : hou maoqing
 Copyright   : Copyright (c) Hou maoqing 2008
 Description : CFileExamAppUi implementation
 ============================================================================
 */

// INCLUDE FILES
#include <avkon.hrh>
#include <aknmessagequerydialog.h>
#include <aknnotewrappers.h>
#include <stringloader.h>
#include <f32file.h>
#include <s32file.h>
#include <hlplch.h>

#include <FileExam_0xEC439938.rsg>

#include "FileExam_0xEC439938.hlp.hrh"
#include "FileExam.hrh"
#include "FileExam.pan"
#include "FileExamApplication.h"
#include "FileExamAppUi.h"
#include "FileExamAppView.h"

_LIT(KFileName, "C:\\private\\EC439938\\FileExam.txt");
_LIT(KText, "Hello World!");

// ============================ MEMBER FUNCTIONS ===============================


// -----------------------------------------------------------------------------
// CFileExamAppUi::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CFileExamAppUi::ConstructL()
	{
	// Initialise app UI with standard value.
	BaseConstructL(CAknAppUi::EAknEnableSkin);

	// Create view object
	iAppView = CFileExamAppView::NewL(ClientRect() );

	// Create a file to write the text to
	TInt err = CCoeEnv::Static()->FsSession().MkDirAll(KFileName);
	if ( (KErrNone != err) && (KErrAlreadyExists != err))
		{
		return;
		}

	RFile file;
	err = file.Replace(CCoeEnv::Static()->FsSession(), KFileName, EFileWrite);
	CleanupClosePushL(file);
	if (KErrNone != err)
		{
		CleanupStack::PopAndDestroy(1); // file
		return;
		}
	
	RFileWriteStream outputFileStream(file);
	CleanupClosePushL(outputFileStream);
	outputFileStream << KText;

	CleanupStack::PopAndDestroy(2); // outputFileStream, file

	}
// -----------------------------------------------------------------------------
// CFileExamAppUi::CFileExamAppUi()
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CFileExamAppUi::CFileExamAppUi()
	{
	// No implementation required
	
	}

// -----------------------------------------------------------------------------
// CFileExamAppUi::~CFileExamAppUi()
// Destructor.
// -----------------------------------------------------------------------------
//
CFileExamAppUi::~CFileExamAppUi()
	{
	if (iAppView)
		{
		delete iAppView;
		iAppView = NULL;
		}

	}

// -----------------------------------------------------------------------------
// CFileExamAppUi::HandleCommandL()
// Takes care of command handling.
// -----------------------------------------------------------------------------
//
void CFileExamAppUi::HandleCommandL(TInt aCommand)
	{
	switch (aCommand)
		{
		case EEikCmdExit:
		case EAknSoftkeyExit:
			Exit();
			break;
			
		case EFileSessionPath:
			this->ExamSessionPath();
			break;
			
		case EFileOperation:
			this->ExamFileOperation();
			break;
			
		case EDirectoryOperation:
			this->ExamDirectoryOperation();
			break;
			
		case EGetDirOperation:
			this->ExamGetDirOperation();
			break;
			
		case EFileReadWriteOperation:
			this->ExamFileReadWriteOperation();
			break;
		
		case EStreamReadWrite:
			this->ExamStreamReadWriteOperation();
			break;

		case ECommand1:
			{

			// Load a string from the resource file and display it
			HBufC* textResource = StringLoader::LoadLC(R_COMMAND1_TEXT);
			CAknInformationNote* informationNote;

			informationNote = new ( ELeave ) CAknInformationNote;

			// Show the information Note with
			// textResource loaded with StringLoader.
			informationNote->ExecuteLD( *textResource);

			// Pop HBuf from CleanUpStack and Destroy it.
			CleanupStack::PopAndDestroy(textResource);
			}
			break;
		case ECommand2:
			{
			RFile rFile;

			//Open file where the stream text is
			User::LeaveIfError(rFile.Open(CCoeEnv::Static()->FsSession(), KFileName, EFileStreamText));//EFileShareReadersOnly));// EFileStreamText));
			CleanupClosePushL(rFile);

			// copy stream from file to RFileStream object
			RFileReadStream inputFileStream(rFile);
			CleanupClosePushL(inputFileStream);

			// HBufC descriptor is created from the RFileStream object.
			HBufC* fileData = HBufC::NewLC(inputFileStream, 32);

			CAknInformationNote* informationNote;

			informationNote = new ( ELeave ) CAknInformationNote;
			// Show the information Note
			informationNote->ExecuteLD( *fileData);

			// Pop loaded resources from the cleanup stack
			CleanupStack::PopAndDestroy(3); // filedata, inputFileStream, rFile
			}
			break;
		case EHelp:
			{

			CArrayFix<TCoeHelpContext>* buf = CCoeAppUi::AppHelpContextL();
			HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), buf);
			}
			break;
		case EAbout:
			{

			CAknMessageQueryDialog* dlg = new (ELeave)CAknMessageQueryDialog();
			dlg->PrepareLC(R_ABOUT_QUERY_DIALOG);
			HBufC* title = iEikonEnv->AllocReadResourceLC(R_ABOUT_DIALOG_TITLE);
			dlg->QueryHeading()->SetTextL(*title);
			CleanupStack::PopAndDestroy(); //title
			HBufC* msg = iEikonEnv->AllocReadResourceLC(R_ABOUT_DIALOG_TEXT);
			dlg->SetMessageTextL(*msg);
			CleanupStack::PopAndDestroy(); //msg
			dlg->RunLD();
			}
			break;
		default:
			Panic(EFileExamUi);
			break;
		}
	}
// -----------------------------------------------------------------------------
//  Called by the framework when the application status pane
//  size is changed.  Passes the new client rectangle to the
//  AppView
// -----------------------------------------------------------------------------
//
void CFileExamAppUi::HandleStatusPaneSizeChange()
	{
	iAppView->SetRect(ClientRect() );
	}

CArrayFix<TCoeHelpContext>* CFileExamAppUi::HelpContextL() const
	{
#warning "Please see comment about help and UID3..."
	// Note: Help will not work if the application uid3 is not in the
	// protected range.  The default uid3 range for projects created
	// from this template (0xE0000000 - 0xEFFFFFFF) are not in the protected range so that they
	// can be self signed and installed on the device during testing.
	// Once you get your official uid3 from Symbian Ltd. and find/replace
	// all occurrences of uid3 in your project, the context help will
	// work.
	CArrayFixFlat<TCoeHelpContext>* array = new(ELeave)CArrayFixFlat<TCoeHelpContext>(1);
	CleanupStack::PushL(array);
	array->AppendL(TCoeHelpContext(KUidFileExamApp, KGeneral_Information));
	CleanupStack::Pop(array);
	return array;
	}

void CFileExamAppUi::ExamSessionPath()
	{
	TFileName sessionPath;
	
	RFs& fs=CCoeEnv::Static()->FsSession();
	fs.SessionPath(sessionPath);
	RDebug::Print(_L("Current SessionPaht:%S\n"),&sessionPath);
	
	TFileName newSessionPath;
	newSessionPath.Copy(_L("c:\\"));
	fs.SetSessionPath(newSessionPath);
	fs.SessionPath(sessionPath);
	RDebug::Print(_L("New Current SessionPaht:%S\n"),&sessionPath);
	}

void CFileExamAppUi::ExamFileOperation()
	{
	if(0)
		{
		//文件改名
		TFileName fnNew;
		TFileName fnOld;
		fnOld.Copy(_L("c:\\Data\\Others\\dir1\\1.txt"));
		fnNew.Copy(_L("c:\\Data\\Others\\dir1\\2.txt"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		TInt nRes=fs.Rename(fnOld,fnNew);
		if(nRes != KErrNone)
			{
			//做错误处理
			}
		}
	
	if(0)
		{
		//文件移动
		TFileName fnNew;
		TFileName fnOld;
		fnOld.Copy(_L("c:\\Data\\Others\\dir1\\3.txt"));
		fnNew.Copy(_L("c:\\Data\\Others\\dir2\\3.txt"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		fs.Rename(fnOld,fnNew);
		}
		
	if(0)
		{
		//删除文件
		TFileName fnNew;
		fnNew.Copy(_L("c:\\Data\\Others\\dir2\\3.txt"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		fs.Delete(fnNew);
		}
	
	if(1)
		{
		//文件名解析
		TFileName fnNew;
		fnNew.Copy(_L("c:\\Data\\Others\\demo.txt"));
		
		TParse fp;
		RFs& fs=CCoeEnv::Static()->FsSession();
		fs.Parse(fnNew,fp);
		RDebug::Print(_L("Driver:   %S\n"),&(fp.Drive()));
		RDebug::Print(_L("Path:     %S\n"),&(fp.Path()));
		RDebug::Print(_L("FileName: %S\n"),&(fp.Name()));
		RDebug::Print(_L("FileExt:  %S\n"),&(fp.Ext()));
		}
	}

void CFileExamAppUi::ExamDirectoryOperation()
	{
	if(1)
		{
		//创建单级目录
		TFileName fnPath,fnPath2;
		fnPath.Copy(_L("c:\\Data\\Others\\dir5\\"));
		fnPath2.Copy(_L("c:\\Data\\Others\\dir5\\dir511\\"));
		RFs& fs=CCoeEnv::Static()->FsSession();
		TInt n1=fs.MkDir(fnPath);
		TInt n2=fs.MkDir(fnPath2);
		}
	
	if(0)
		{
		//创建多级目录
		TFileName fnPath;
		fnPath.Copy(_L("c:\\Data\\Others\\dir6\\dir61\\dir611\\"));
		RFs& fs=CCoeEnv::Static()->FsSession();
		TInt n1=fs.MkDirAll(fnPath);
		}
	
	if(1)
		{
		//删除目录
		TFileName fnPath;
		fnPath.Copy(_L("c:\\Data\\Others\\dir6\\dir61\\dir611\\"));
		RFs& fs=CCoeEnv::Static()->FsSession();
		fs.RmDir(fnPath);
		}
	}

void CFileExamAppUi::ExamGetDirOperation()
	{
	if(1)
		{
		//获得指定目录下子目录和文件列表
		TFileName fnPath;
		fnPath.Copy(_L("c:\\Data\\"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		
		CDir* pDir=NULL;
		TInt nn=fs.GetDir(fnPath,KEntryAttNormal|KEntryAttMatchMask,ESortByDate,pDir);
		for(int i=0;i<pDir->Count();i++)
			{
			RDebug::Print(_L("%S\n"),&((*pDir)[i].iName));
			}
		delete pDir;
		}
	
	if(0)
		{
		//获得指定目录下子目录、文件列表,文件和目录分开存放
		TFileName fnPath;
		fnPath.Copy(_L("c:\\Data\\"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		
		CDir* pDir=NULL,*pFile=NULL;
		TInt nn=fs.GetDir(fnPath,KEntryAttNormal,ESortByDate,pFile,pDir);
		for(int i=0;i<pDir->Count();i++)
			{
			RDebug::Print(_L("Dir: %S\n"),&((*pDir)[i].iName));
			}
		for(int i=0;i<pFile->Count();i++)
			{
			RDebug::Print(_L("File: %S\n"),&((*pFile)[i].iName));
			}
		delete pDir;
		delete pFile;
		}
	}

void CFileExamAppUi::ExamFileReadWriteOperation()
	{
	if(1)
		{
		//创建文件
		TFileName fnDataFile;
		fnDataFile.Copy(_L("c:\\Data\\FileExam.dat"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		
		RFile file;
		//file.Create(fs,fnDataFile,EFileWrite);
		file.Replace(fs,fnDataFile,EFileWrite);
		
		//写数据到文件中
		TInt nID;
		TBuf<20> bufName;
		TInt nNameLen;
		
		nID=10;
		bufName.Append(_L("John"));
		nNameLen=bufName.Length();
		
		TPtrC8 ptrID((TUint8*)(&nID),sizeof(TInt));
		TPtrC8 ptrName((TUint8*)bufName.Ptr(),bufName.Size());
		TPtrC8 ptrNameLen((TUint8*)(&nNameLen),sizeof(TInt));
		
		file.Write(ptrID);
		file.Write(ptrNameLen);
		file.Write(ptrName);
		
		/*HBufC8* pName=HBufC8::NewL(bufName.Length());
		TPtr8 ptr8Name=pName->Des();
		ptr8Name.Copy(bufName);
		file.Write(ptr8Name);*/
		
		file.Close();
		}
	
	if(1)
		{
		//打开文件
		TFileName fnDataFile;
		fnDataFile.Copy(_L("c:\\Data\\FileExam.dat"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		
		RFile file;
		file.Open(fs,fnDataFile,EFileRead | EFileWrite);
		
		//从文件中读数据
		TInt nID;
		TBuf<20> bufName;
		TInt nNameLen;
		
		TPtr8 ptrID((TUint8*)(&nID),sizeof(TInt));
		TPtr8 ptrName((TUint8*)bufName.Ptr(),20*2);
		TPtr8 ptrNameLen((TUint8*)(&nNameLen),sizeof(TInt));
		
		file.Read(ptrID);
		file.Read(ptrNameLen);
		file.Read(ptrName,nNameLen*2);
		bufName.SetLength(nNameLen);
		
		RDebug::Print(_L("ID=%d  Name=%S"),nID,&bufName);
		RWriteStream ts;
		file.Close();
		}
	}

class TUserGroup
	{
public:
	TInt32 m_nGroupID;
	TBuf16<20> m_bufGroupName;

	void ExternalizeL(RWriteStream& aStream) const;
	void InternalizeL(RReadStream& aStream);
	};

void TUserGroup::ExternalizeL(RWriteStream& aStream) const
	{
	aStream << m_nGroupID;
	aStream << m_bufGroupName;
	}

void TUserGroup::InternalizeL(RReadStream& aStream)
	{
	aStream >> m_nGroupID;
	aStream >> m_bufGroupName;
	}

void CFileExamAppUi::ExamStreamReadWriteOperation()
	{
	if(1)
		{
		//创建流式文件
		TFileName fnDataFile;
		fnDataFile.Copy(_L("c:\\Data\\StreamExam.dat"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		
		RFileWriteStream fileWriteStream;
		//User::LeaveIfError(fileWriteStream.Create(fs,fnDataFile,EFileWrite));
		User::LeaveIfError(fileWriteStream.Replace(fs,fnDataFile,EFileWrite));
		fileWriteStream.PushL();
		
		//外部化数据到文件中
		TInt32 nID;
		TBuf16<20> bufName;
		
		nID=10;
		bufName.Append(_L("John"));
		
		fileWriteStream << nID;
		fileWriteStream << bufName;
		
		//外部化存储自定义类
		TUserGroup userGroup;
		userGroup.m_nGroupID=50;
		userGroup.m_bufGroupName.Copy(_L("beijing"));
		fileWriteStream << userGroup;
		
		//提交更改、释放资源
		fileWriteStream.CommitL();
		fileWriteStream.Pop();
		fileWriteStream.Release();
		}
	
	if(1)
		{
		//打开流式文件
		TFileName fnDataFile;
		fnDataFile.Copy(_L("c:\\Data\\StreamExam.dat"));
		
		RFs& fs=CCoeEnv::Static()->FsSession();
		
		RFileReadStream fileReadStream;
		User::LeaveIfError(fileReadStream.Open(fs,fnDataFile,EFileRead));
		fileReadStream.PushL();
		
		//从文件中内部化数据
		TInt32 nID;
		TBuf16<20> bufName;
		
		fileReadStream >> nID;
		fileReadStream >> bufName;
		RDebug::Print(_L("ID=%d  Name=%S"),nID,&bufName);
		
		//内部化自定义类
		TUserGroup userGroup;
		fileReadStream >> userGroup;
		RDebug::Print(_L("GroupID=%d  GroupName=%S"),userGroup.m_nGroupID,&(userGroup.m_bufGroupName));
		
		//释放资源
		fileReadStream.Pop();
		fileReadStream.Release();
		}
	}

// End of File

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?