为了使用文件服务器,调用者首先必须创建一个由RFs 类的实例来表示的文件服务器会
话。
通过调用Connect()来初始化文件服务器会话,Connect()会返回错误代码。客户端应
负责关闭已经连接的文件服务器会话。如果文件服务器会话是一个局部变量,那么客户端应
该使用清除栈以确保如果发生异常退出(Leave)会话被关闭。
RFs fs;
User::LeaveIfError(fs.Connect()); // 连接到会话
CleanupClosePushL(fs); // 当异常退出发生时,关闭fs
... // 使用文件服务器
CleanupStack::PopAndDestroy(&fs); // 关闭会话
文件服务器会话(File Server Session)----From Devdiv.net
1、文件 服务器会话(File Server Session)
Symbian 中的文件操作离不开文件服务器会话api——RFs。文件服务器运行 于EFile.exe中,RFs api提供了通往文件服务器的“通道”,通过RFs我们可以执行各种文件操作。
2、获取 File Server Session的常用方法
1)使用RFs的Connect()方法:
- RFs aFSSession;
- User::LeaveIfError(aFSSession.Connect());
- // 可以使用aFSSession
- // ......
- // 关闭file server session,释放相关资源
- aFSSession.Close();
2)使用CCoeEnv:
- RFs& aFSSession = iCoeEnv->FsSession();
3)使用CCoeEnv::Static():
在GUI程序中,如果你想在一些自己写的一些类中获取FSS,可以使用下列方法:
- RFs& aFSSession = CCoeEnv::Static()->FsSession();
CEikonEnv继承自CCoeEnv,使用它来获取FSS与使用CCoeEnv是一样的。
- RFs& aFSSession = iEikonEnv->FsSession();
- RFs& aFSSession = CEikonEnv::Static()->FsSession();
- #define iEikonEnv (STATIC_CAST(CEikonEnv*,iCoeEnv))
下面的函数演示了如何向一个文件写入二进制数据:
- static void WriteDesC8ToFileL(const TDesC& aFileName, const TDesC8& aBinaryData)
- {
- RFile aFile;
- User::LeaveIfError(aFile.Replace(CCoeEnv::Static()->FsSession(), aFileName, EFileWrite));
- CleanupClosePushL(aFile);
- User::LeaveIfError(aFile.Write(aBinaryData));
- // It will be release the resource of file
- // DO NOT Close AGAIN
- CleanupStack::PopAndDestroy(&aFile);
- }、
2、读出二进制数据- static void ReadDesC8FromFileL(const TDesC& aFileName, TDes8& aBuffer)
- {
- RFile aFile;
- User::LeaveIfError(aFile.Open(CCoeEnv::Static()->FsSession(), aFileName, EFileRead));
- CleanupClosePushL(aFile);
- User::LeaveIfError(aFile.Read(aBuffer));
- CleanupStack::PopAndDestroy(&aFile);
- }
- 3、从文本文件读取数据
- 多行的文本文件一般都由EOL分隔符来分隔每一行的数据。Symbian中的分隔符是LF(0x0A)。
Symbian的文本文件通常都保存为Unicode格式。读写文本文件的常用api是TFileText,由于文本文件通常都为Unicode,所以TFileText api使用16位描述符作为参数。下面的函数演示了如何读取一个文本文件:使用TFileText可以读取换行符为CR LF(0x0D 0x0A)或LF(0x0A)的Unicode文件(包含BOM(Byte-Order Mark)的也可以)。另外注意不要使用TFileText来读取非Unicode文件,否则将会出现一些垃圾字符。- static void ReadTextFileL(const TDesC& aFileName, TDes& aBuffer)
- {
- RFile aFile;
- User::LeaveIfError(aFile.Open(CCoeEnv::Static()->FsSession(), aFileName, EFileRead | EFileStreamText));
- CleanupClosePushL(aFile);
- // create a TFileText and points it to file
- TFileText aFileText;
- aFileText.Set(aFile);
- TBuf<256> buffer;
- TInt errCode = KErrNone;
- while (errCode != KErrEof)
- {
- errCode = aFileText.Read(buffer);
- if (errCode == KErrNone)
- {
- aBuffer.Append(buffer);
- }
- }
- CleanupStack::PopAndDestroy(&aFile);
- }
2、使用RFile api时要特别关注api的返回值,它表示了文件操作是否正确完成,若发生错误,程序应该做一些错误处理。以下是一个简单的范例:
- _LIT16(KFileName, "C://Data//WantToWrite.ini");
- _LIT8(KWriteContent, "DevDiv Test");
- TInt errCode = 0;
- TRAP(errCode, WriteDesC8ToFileL(KFileName, KWriteContent));
- if (errCode == KErrPathNotFound)
- {
- // 路径不存在,创建路径并重试
- // 或者弹出错误提示告知用户,具体错误处理需根据需求或具体情况确定
- }
// Create select memory dialog
CAknMemorySelectionDialo
CAknMemorySelectionDialog::TMemory memory = CAknMemorySelectionDialog::EPhoneMemory;
// Create select folder dialog
CAknFileSelectionDialog* dlg = CAknFileSelectionDialog::NewL(ECFDDialogTypeCopy);
// some dialog customizations:
dlg->SetTitleL(_L("Select folder"));
dlg->SetRightSoftkeyRootFolderL(_L("Back"));
// for root folder
TBool result = EFalse;
for (;;)
{
if ( memDlg->ExecuteL(memory) == CAknFileSelectionDialog::ERightSoftkey )
{
// cancel selection
break;
}
if (memory==CAknMemorySelectionDialog::EMemoryCard)
{
folder = PathInfo::MemoryCardRootPath();
}
else
{
folder = PathInfo::PhoneMemoryRootPath();
}
if (dlg->ExecuteL(folder))
{ // we got our folder and finish loop
CAknInformationNote* note=new(ELeave)CAknInformationNote();
note->ExecuteLD(folder);
result = ETrue;
break;
}
}
delete memDlg;
delete dlg;
文件Model
文件的相关操作
1 重命名
RFs fs;
User::LeaveIfError(fs.Connect());
CleanUpClosePushL(fs);
_LIT(KFilePath,"C://hello.txt");
RFile myFile;
myFile.Open(fs,KFilePath,EFileWrite);
CleanupClosePushL(myFile);
_LIT(KNewFileName,"world");
myFile.Rename(KNewFileName);
CleanupStack::Pop(2);
结果:将c目录下hello.txt该为world.txt
2删除
//文件必须已经关闭 文件必须非只读
//RFs::Delete()不支持通配符
//删除多个文件用CFileMan::Delete() 而非文件会话的方法
RFs fs;
User::LeaveIfError(fs.Connect());
CleanupClosePushL(fs);
_LIT(KFilePath,"c://hello.txt");
fs.Delete(KFilePath);
CleanupStack::PopAndDestroy();
结果:c目录下的文件hello.txt被删除
3创建文件
RFs fs;
User::LeaveIfError(fs.Connect());
CleanupClosePushL(fs);
_LIT(KNewFile,"c://hello");
RFile myFile;
CleanupClosePushL(myFile);
myFile.Create(fs,KNewFile,EFileWrite);
CleanupStack::PopAndDestroy(2);
4 写入文件
RFs fs;
User::LeaveIfError(fs.Connect());
CleanupClosePushL(fs);
_LIT(KNewFile,"c://hello");
RFile myFile;
CleanupClosePushL(myFile);
_LIT(KNewFileName,"world");
myfile.Write(KNewFileName);
CleanupStack::PopAndDestroy(2);
5访问某个文件中的目录
_LIT(KDir,"c://Logs//*");
CDir* dirList;
User::LeaveIfError(fs.GetDir(KDir, KEntryAttMaskSupported,ESortByName, dirList));
_LIT(KString,"%S/n");
for (TInt i = 0; i < dirList->Count(); i++)
{
TBuf< KMaxFileName > iName= (*dirList)[i].iName;
TBuf8<KMaxFileName> iNameNew;
iNameNew.Copy(iName);
myFile.Write(iNameNew); //TDesC8 & aDes
}
delete dirList;
dirList=NULL;
CleanupStack::PopAndDestroy(2);
6 列出目录中的文件
CDir* fileList;
_LIT(KDirectory,"C://Doucuments//");
User::LeaveIfError(fsSession.GetDir(KDirectory,KEntryAttNormal,EsortByName,fileList));
分别列出目录和文件
CDir* fileList;
Cdir* dirList;
User::LeaveIfError(fsSession.GetDir(KDirectory,KEntryNormal,ESortByName,fileList,dirList));
7 移动文件到其他目录
TFileName path;
_LIT(KPath1,"C://docunment//tmpfile.txt");
_LIT(KPath2,"C://documents// tmpdir1//tmpfile.txt");
User::LeaveIfError(fsSession.Rename(KPath1,Kpath2));
//Rename既可以重命名,也可以修改文件路径
path1 移动到path2
另外 还可以使用RFs::Repleace()和CFileMan::Move()移动文件
8 创建目录
_LIT(KDirectory,"C://tmpdir//");
User::LesveIfError(fsSession.MkDir(KDirectory));
删除目录(只能删除空目录)
_LIT(KDirectory,"C://tmpdir//");
User::LesveIfError(fsSession.RmDir(KDirectory));
对 文件路径的操作的方法
Drive() 得到文件的盘符
Path()文件路径
Name()获得文件名称
Ext()获得文件的属性
AddDir()增加文件的路径,多层次
PopDir()去除文件的路径,少层次 向上提一级目录
TParsePtr和TParsePtrC是轻量级的,即只存储对象的引用,而非对象本身
TParse则存储对象本身,即TBuf<256>,比较大一般不使用
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$4444
写文件流和读文件流
9 通过流来写文件
RFileWriteStream writer;
writer.PushL(); // 压栈
TInt err;
_LIT(KFile,"C://hello.txt");
err =write.Replace(fs,KFile,EFileWrite);
User::LeaveifError(err);
_LIT(KText,"Hello Word!");
TBuf<30> buf(KText);
write.Flush(); //提交 写入到文件中去
CleanupStack::PopAndDestory(writer);
10 通过流来读文件
RFileReadStream raeder;
reaser.PushL();
TInt err;
Tbuf<30> buf;
_LIT(KFile,"C://hello.txt");
err =reader.Open(fs,KFile,EFileRead);
User::LeaveifError(err);
reader>>buf;
CleanupStack::PopAndDestory(reader);
system文件夹各文件名、意义及作用
通讯录:C:/System/Data/contacts.cdbC:/System/Data/CntModel.ini
2030

被折叠的 条评论
为什么被折叠?



