封装了流的操作 /* ============================================================================ Name : WindcaoStreamOpt.cpp Author : windcao Copyright : windcao@people.com.cn Description : Exe source file ============================================================================ */ #ifndef WC_STREAM_OPT_H_ #define WC_STREAM_OPT_H_ #include <e32std.h> #include <f32file.h> #include <s32file.h> #include <COEMAIN.h> const TInt KMaxReOpenTime = 7; const TTimeIntervalMicroSeconds32 KInitReOpenWaitAfterTime = 50000;//0.05secd template<typename T> void Stream_LoadL(RFs& aFsSession, const TDesC& aFileName, T& aSettings) { RFile rFile; //Open file where the stream text is TInt resultOpen = KErrNotReady; TInt reopen = KMaxReOpenTime; TTimeIntervalMicroSeconds32 afterTime = KInitReOpenWaitAfterTime;//0.05secd while (reopen > 0) { resultOpen = rFile.Open(aFsSession, aFileName, EFileStream | EFileShareReadersOnly); if (resultOpen != KErrNone) { if (resultOpen == KErrInUse) { User::After(afterTime);//after 0.05*3^(3-reopen) second afterTime = afterTime.Int() * 3;//0.05 0.15 0.45 1.35,4.05,12.15,36.45 second } else { break; } } else break; reopen--; } if (resultOpen == KErrNone) { CleanupClosePushL(rFile); // copy stream from file to RFileStream object RFileReadStream inputFileStream(rFile); CleanupClosePushL(inputFileStream); inputFileStream >> aSettings; // Pop loaded resources from the cleanup stack CleanupStack::PopAndDestroy(2); // inputFileStream, rFile } else { User::Leave(resultOpen); } } template<typename T> void Stream_SaveL(RFs& aFsSession, const TDesC& aFileName, const T& aSettings) { // Create a file to write the text to TInt errMakeAll =aFsSession.MkDirAll(aFileName); if(errMakeAll != KErrAlreadyExists && errMakeAll != KErrNone) User::Leave(errMakeAll); RFile file; TInt errRaplace = KErrNone; TInt reopen = KMaxReOpenTime; TTimeIntervalMicroSeconds32 afterTime = KInitReOpenWaitAfterTime;//0.05secd while (reopen > 0) { errRaplace = file.Replace(aFsSession, aFileName, EFileWrite); if (errRaplace != KErrNone) { if (errRaplace == KErrInUse) { User::After(afterTime);//after 0.05*3^(3-reopen) second afterTime = afterTime.Int() * 3;//0.05 0.15 0.45 1.35,4.05,12.15,36.45 second } else { //DEBUG(0,"iAppInfoDb.OpenL err=%d",error); break; } } else break; reopen--; } User::LeaveIfError(errRaplace); CleanupClosePushL(file); RFileWriteStream outputFileStream(file); CleanupClosePushL(outputFileStream); outputFileStream << aSettings; CleanupStack::PopAndDestroy(2); // outputFileStream, file } #endif /* WC_STREAM_OPT_H_ */ 使用方法: /* ============================================================================ Name : WindcaoStreamOpt.cpp Author : windcao Copyright : windcao@people.com.cn Description : Exe source file ============================================================================ */ // Include Files #include "wc_stream_opt.h" #include "WindcaoStreamOpt.h" #include <e32base.h> #include <e32std.h> #include <e32cons.h> // Console #include "data.h" // Constants _LIT(KTextConsoleTitle, "Console"); _LIT(KTextFailed, " failed, leave code = %d"); _LIT(KTextPressAnyKey, " [press any key]/n"); // Global Variables LOCAL_D CConsoleBase* console; // write all messages to this // Local Functions _LIT(KFileName,"c://stinfo.cfg"); LOCAL_C void MainL() { // // add your program code here, example code below // RFs fsSession; User::LeaveIfError(fsSession.Connect()); console->Write(_L("Saving... /n")); CDatafile* dataA = new(ELeave)CDatafile(123,_L("xiao wang"),_L("2010-1-21")); CleanupStack::PushL(dataA); Stream_SaveL(fsSession,KFileName,*dataA); CleanupStack::PopAndDestroy(dataA); console->Write(_L("Loading... /n")); CDatafile* dataB = new(ELeave)CDatafile(); CleanupStack::PushL(dataB); Stream_LoadL(fsSession,KFileName,*dataB); console->Printf(_L("%d,%S,%S/n"),dataB->iId,dataB->iLabelText,&(dataB->iTime)); CleanupStack::PopAndDestroy(dataB); } LOCAL_C void DoStartL() { // Create active scheduler (to run active objects) CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); CleanupStack::PushL(scheduler); CActiveScheduler::Install(scheduler); MainL(); // Delete active scheduler CleanupStack::PopAndDestroy(scheduler); } // Global Functions GLDEF_C TInt E32Main() { // Create cleanup stack __UHEAP_MARK; CTrapCleanup* cleanup = CTrapCleanup::New(); // Create output console TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(KConsFullScreen, KConsFullScreen))); if (createError) { delete cleanup; return createError; } // Run application code inside TRAP harness, wait keypress when terminated TRAPD(mainError, DoStartL()); if (mainError) console->Printf(KTextFailed, mainError); console->Printf(KTextPressAnyKey); console->Getch(); delete console; delete cleanup; __UHEAP_MARKEND; return KErrNone; } 例子代码:http://download.csdn.net/source/2011551