概述
提供了对文件系统的应用程序接口。
在Symbian 中文件的存取是通过Symbian OS 文件服务器提供的。服务器提供了本地的文件系统( ROM 、RAM 和移动存储) 。驱动器、目录和文件的层次关系是VFAT( 虚拟文件分配表),因此这种文件系统很自然的与PC 相兼容。流存储定义了存储的API ,包含了文件的接口,通常直接使用存储API 代替文件API 。
文件服务器相关的API 包含了7 个关键的概念:文件服务器会话、文件、目录、单元、路径和文件名分析器、文件管理、文件查找。
文件服务器会话:从客户端到服务器的所有访问都是通过文件服务器会话。它提供了文件系统处理函数,包括添加、删除、移动和重命名文件;检查和改变文件属性;请求通知。RFs 提供了文件服务器会话。
文件:文件能够打开,创建或替代。在文件读或写之前必须先打开。在读或写文件时,数据是经过描述符进行传递。文件也能够通过文件存储API 提供的文件流类进行读或写。RFile 提供了文件接口。
目录项:目录项可以是目录、文件或卷标。目录项可以读取或排序。从一个目录读取一条目录项,使用RDir 。同时读取多条目录项,使用RFs 函数和相关的CDir 。目录项类型是TEntry 。
单元:单元是一个可能有驱动器的驱动器设备。对于移动介质,单元是一直存在的,但驱动器设备不一定存在。RFs 提供了查找单元上驱动器是否存在的方法,驱动器的信息被包装在TDriveUnit 、TDriveInfo 和TVolumeInfo 中。
路径和文件名分析器:一个文件名包括逻辑驱动器、路径、名称和扩展名。TParase 提供了文件名的操作接口。
文件管理:CFileMan 提供了大量文件拷贝、移动和其他文件管理的高效操作。
文件查找:TFindFile 提供了高级别的文件查找操作。
Symbian OS 文件服务器(二) — 文件服务器会话
RFs
概述
RFs 类包装了与文件服务器的会话的句柄,通过RFs 类型可以访问文件服务器。每一个连接到文件服务器的RFs 都要求消耗一定服务器端资源和系统资源。因此,应该尽可能减少与文件服务器会话的数量。RFs 类不允许用户继承。
RFs 类提供了全部的文件系统服务,包括:
1、 添加、删除、移动和重命名文件以及目录
2、 检查和改变文件属性以及目录项信息。这包括文件和目录最后修改的时间日期、大小,以及文件只读、隐藏、存档或系统的属性标记。
3、 可获得目录列表。
4、 维护了一个单一系统的缺省路径,而不像其他一些系统,每一个驱动器都用一个缺省路径。
5、 使用TParse 对象可分析文件名。
6、 可获得驱动器和卷标的信息。
7、 格式化和标注卷标。
8、 可获得有效的驱动器列表、
9、 仿效DOS 的subst 命令,将路径与驱动器号关联,允许任意一个目录当作一个磁盘驱动器来看。
10、 当有重要的改变发生时,发出请求。用于当程序维护了一个文件列表,当系统中的文件发生改变时,必须发出请求更新这些列表。
11、 查找文件服务器的版本号。
12、 确保了当会话结束时,所以的资源都将关闭。
RFs API
1、Connect()、 Close()
IMPORT_C TInt Connect(TInt aMessageSlots=KFileServerDefaultMessageSlots);
连接一个与文件服务器的会话。在使用文件服务器之前,必须连接服务器会话。对于UI 应用程序,控制环境(CONE) 是组成程序框架的一部分,它提供了文件服务器会话的永久句柄,可以通过iCoeEnv 上调用FsSession() 来获得句柄的引用,而不用再连接新的会话。
IMPORT_C void Close();
关闭文件服务器会话句柄。如果句柄被多个对象所引用,在关闭前要确保其他对象不在使用。如果句柄没有通过Close() 关闭,那么文件服务器会话将在它所在的线程结束时自动关闭。
2、SessionPath ()、 SetSessionPath()
IMPORT_C TInt SessionPath(TDes &aPath) const;
获得当前的会话路径。当客户端连接到文件服务器上后,会话路径就初始化为系统的缺省路径。
IMPORT_C TInt SetSessionPath(const TDesC &aPath);
重新设置会话路径,路径中不能包含文件名。
3、GetDir()
IMPORT_C TInt GetDir(const TDesC &aName, TUint anEntryAttMask,
TUint anEntrySortKey, CDir *&anEntryList) const;
获得经筛选后的文件和目录项列表。anEntryAttMask决定了目录项筛选的方法,anEntrySortKey决定了目录项的排序规则,anEntryList引用了文件和目录项列表的指针。
IMPORT_C TInt GetDir(const TDesC &aName, TUint anEntryAttMask,
TUint anEntrySortKey, CDir *&anEntryList,
CDir *&aDirList) const;
获得一个经筛选后的文件和目录项列表和一个不筛选的只含目录项列表。anEntryAttMask决定了第一个列表筛选的方法,anEntrySortKey决定了两个列表的排序规则,anEntryList引用了文件和目录项列表的指针,aDirList引用了目录项列表的指针。
4、MkDir()、MkDirAll()、RmDir()、Delete()
IMPORT_C TInt MkDir(const TDesC &aPath);
IMPORT_C TInt MkDirAll(const TDesC &aPath);
创建新的目录项,MkDir() 的所有上级目录必须存在,MkDirAll() 将创建所有不存在的上级目录。
IMPORT_C TInt RmDir(const TDesC &aPath);
删除指定目录,指定的目录必须为空。
IMPORT_C TInt Delete(const TDesC &aName);
删除指定的文件。不能使用通配符删除文件。
5、Att()、SetAtt()
IMPORT_C TInt Att(const TDesC &aName, TUint &aAttValue) const;
获得指定文件的属性。aAttValue 的二进制数的每一位表示一种属性。
IMPORT_C TInt SetAtt(const TDesC &aName, TUint aSetAttMask,
TUint aClearAttMask);
设置或清除指定文件的属性。aSetAttMask 为设置的属性值,aClearAttMask 为清除的属性值。
6、Modified()、SetModified()
IMPORT_C TInt Modified(const TDesC &aName, TTime &aTime) const;
获得指定文件或目录的最后修改时间日期,以UTC ( 协调世界时) 表示。
IMPORT_C TInt SetModified(const TDesC &aName, const TTime &aTime);
设置指定文件或目录的最后修改时间日期,以UTC ( 协调世界时) 表示。
7、Entry()、SetEntry()
IMPORT_C TInt Entry(const TDesC &aName, TEntry &anEntry) const;
获得指定文件或目录项的详细信息。anEntry 为详细信息的引用。
IMPORT_C TInt SetEntry(const TDesC &aName, const TTime &aTime,
TUint aSetAttMask, TUint aClearAttMask);
同时设置文件或目录项的属性和最后修改时间。aTime为新的修改时间,aSetAttMask为设置的属性值,aClearAttMask为清除的属性值。
8、Replace()和Rename()
IMPORT_C TInt Replace(const TDesC &anOldName, const TDesC &aNewName);
将anOldName路径下 的文件移到aNewName 路径下。若aNewName 路径下有同名文件,那么将覆盖这个文件。文件名中不能带通配符。
IMPORT_C TInt Rename(const TDesC &anOldName, const TDesC &aNewName);
当源路径和目的路径相同时,为重新命名文件或目录。当源路径和目的路径不同时,为移动文件或目录,不支持对已有文件和目录的覆盖。移动目录时,目录下所以内容将一起移动。路径中不能带有通配符。
9、DriveList()、DriveToChar()、CharToDrive()、 Drive()、Volume()
IMPORT_C TInt DriveList(TDriveList &aList) const;
获得一个可用的驱动器列表。列表包含26 项,第0 项对应驱动器A 、第1项 对应驱动器B, 以此类推。某一项的值为非零时,表示对应的驱动器可用。
static IMPORT_C TInt DriveToChar(TInt aDrive, TChar &aChar);
将驱动器数字表示映射到传统的驱动器字母表示。
static IMPORT_C TInt CharToDrive(TChar aChar, TInt &aDrive);
将传统的驱动器字母表示映射到驱动器数字表示。
IMPORT_C TInt Drive(TDriveInfo &anInfo, TInt aDrive=KDefaultDrive) const;
获得指定驱动器的信息。
IMPORT_C TInt Volume(TVolumeInfo &aVol, TInt aDrive=KDefaultDrive) const;
获得指定卷标的信息。
10、Parse()
IMPORT_C TInt Parse(const TDesC &aName, TParse &aParse) const;
IMPORT_C TInt Parse(const TDesC &aName, const TDesC &aRelated,
TParse &aParse) const;
分析指定的文件名称信息。
11、NotifyChange()、NotifyChangeCancel()、SetNotifyChange()
IMPORT_C void NotifyChange(TNotifyType aType, TRequestStatus &aStat);
IMPORT_C void NotifyChange(TNotifyType aType, TRequestStatus &aStat,
const TDesC &aPathName);
IMPORT_C void NotifyChangeCancel();
IMPORT_C void NotifyChangeCancel(TRequestStatus &aStat);
IMPORT_C TInt SetNotifyChange(TBool aNotifyChange);
12、NotifyDiskSpace()、NotifyDiskSpaceCancel()
IMPORT_C void NotifyDiskSpace(TInt64 aThreshold, TInt aDrive,
TRequestStatus &aStat);
IMPORT_C void NotifyDiskSpaceCancel(TRequestStatus &aStat);
IMPORT_C void NotifyDiskSpaceCancel();
Symbian OS 文件服务器(三) — 文件
RFile
概述
实现了创建打开一个文件,以及在单一文件上的所有操作,包括: 读写文件、在文件中定位、在文件中锁和解锁、设置文件属性。在使用上面功能时,必须连接一个文件服务器会话,并且文件处于打开状态。
打开文件的方式:
1、 使用Open() 成员函数打开一个已存在的文件,通过设置访问模式,可以对文件进行读或写操作;如果文件不存在将返回错误。
2、 使用Create() 成员函数创建并打开一个文件,对文件进行写操作,如果文件已存在将返回错误。
3、 使用Replace() 成员函数打开一个文件,对文件进行写操作;如果文件已存在将替换原文件,如果文件不存在将创建文件。
4、 使用Temp() 成员函数创建并打开一个临时文件,对文件进行读或写操作。
RFile 中定义多个重载的Read() 和Write() 函数,每个函数都用于不同的读写方式。
RFile API
1、Open()、Create()、Replace()、Temp()、Close()、Flush()
IMPORT_C TInt Open(RFs &aFs, const TDesC &aName, TUint aFileMode);
打开一个已存在的文件进行读或写操作。如果文件不存在将返回错误。aFs为已连接的文件服务器会话的引用;aFileMode为文件的打开模式(详细见TFileMode)。如果尝试打开一个"只读"属性的文件进行写操作,将返回错误。文件打开后,当前文件写位置缺省为文件开始处,可以通过Seek()设置不同的写位置。
IMPORT_C TInt Create(RFs &aFs, const TDesC &aName, TUint aFileMode);
创建并打开一个文件进行读操作,并自动设置文件的属性为存档。如果文件已存在或文件路径不存在将返回错误。
IMPORT_C TInt Replace(RFs &aFs, const TDesC &aName, TUint aFileMode);
打开一个文件进行写操作,并自动设置文件的属性为存档。如果文件已存在,则代替已存在文件的内容;如果文件不存在,则创建新文件。如果文件已存在或文件路径不存在将返回错误。
IMPORT_C TInt Temp(RFs &aFs, const TDesC &aPath, TFileName &aName,
TUint aFileMode);
创建一个唯一文件名的临时文件进行读或写。
IMPORT_C void Close();
关闭文件。任何文件将在文件服务器会话结束时自动关闭。
IMPORT_C TInt Flush();
提交数据到文件内。尽管Close() 也能够在关闭文件前自动调用Flush() 提交数据。但Close() 不能获得提交数据失败返回的错误信息。
2、Seek()
IMPORT_C TInt Seek(TSeek aMode, TInt &aPos) const;
设置文件的读写位置,也可以获得文件当前的读写位置。文件开始的读写位置为0 。aMode 指定了文件的查找的起点(文件开始位置ESeekStart 、文件结束位置ESeekEnd 、文件当然位置ESeekCurrent );aPos 指定了相对于查找起点位置的字节数偏移量,可以为负值。函数执行后aPos 将返回文件新的读写位置。
3、Size()、SetSize()
IMPORT_C TInt Size(TInt &aSize) const;
获得当前文件的字节大小。aSize 返回当然文件的字节大小。
IMPORT_C TInt SetSize(TInt aSize);
设置文件的字节大小。如果文件的大小减少了,那么数据将从文件结束位置处删除。设置文件大小后,文件当前的读写位置不会改变或改变为文件结束位置。必须在文件以写操作打开文件时使用该函数。
4、Att()、SetAtt()、Modified()、SetModified()、Set()
IMPORT_C TInt Att(TUint &aAttValue) const;
获得文件的属性。
IMPORT_C TInt SetAtt(TUint aSetAttMask, TUint aClearAttMask);
设置文件属性并同时清除文件其他属性。
IMPORT_C TInt Modified(TTime &aTime) const;
获得文件最后的修改时间。
IMPORT_C TInt SetModified(const TTime &aTime);
设置文件最后的修改时间。
IMPORT_C TInt Set(const TTime &aTime, TUint aSetAttMask,
TUint aClearAttMask);
同时设置文件的属性和最后修改时间。
5、Rename()
IMPORT_C TInt Rename(const TDesC &aNewName);
将打开的文件重命名为指定的文件名。如果指定的文件名与打开的文件名相同,但路径不同,则将打开的文件移动到指定的路径下。
6、Drive()
IMPORT_C TInt Drive(TInt &aDriveNumber, TDriveInfo &aDriveInfo) const;
获得文件所在的驱动器的信息。
Symbian OS 文件服务器(四) — 目录项
RDir
概述
读取目录下的目录项。在读取目录项前,必须使用目录项属性过滤参数打开目录项所在的目录,然后才能使用Read() 函数读取属性过滤后的目录项。操作完成后,应该使用Close() 函数关闭打开的目录。
有两种版本的Read() 方法:一种是每次只读取一个目录项,要求遍历所有目录项。另一种使用一个TEntryArray 类型,可以一次读取多个目录项。为了让应用程序逻辑简单,这种类型和服务器的交互少,并且非常高效。
每种版本的Read() 方法都能工作在同步或异步模式。
通常,RFs::GetDir() 要不RDir::Read() 更为便利。RFs::GetDir() 可以允许目录项以不同的方式进行排序。然而,它却不区分同步或异步模式,并且不允许逐个读取目录项。
RDir API
1、Open()、Close()
IMPORT_C TInt Open(RFs &aFs, const TDesC &aMatchName, TUint anAttMask);
打开一个使用了属性掩码过滤后的目录。在使用任何版本的Read() 函数前,必须先调用该函数。
IMPORT_C void Close();
关闭打开的目录项。
2、Read()
IMPORT_C TInt Read(TEntryArray &anArray) const;
读取过滤后所有的目录项到指定的目录项数组中。这是一个同步函数,操作完成后才返回。
IMPORT_C void Read(TEntryArray &anArray, TRequestStatus &aStatus) const;
读取过滤后所有的目录项到指定的目录项数组中。这是一个异步函数。
IMPORT_C TInt Read(TEntry &anEntry) const;
一次读取过滤后的一个目录项。这是一个同步函数。
IMPORT_C void Read(TPckg&anEntry,TRequestStatus &aStatus)const;
一次读取过滤后的一个目录项。这是一个异步函数。
CDir
概述
已经从文件系统中读取到内存的目录项数组。用户程序可以读取和排序目录项数组,但不能创建。
CDir API
1、RFs::GetDir()
获得目录项数组的CDir 指针。由于用户不能创建CDir 对象,所以CDir 没有公开的构造函数。
2、Count()、operator[]()、Sort()
IMPORT_C TInt Count() const;
获得目录项数组的长度。
IMPORT_C const TEntry &operator[](TInt anIndex) const;
通过数组下标获得指定的一个目录项。
IMPORT_C TInt Sort(TUint aEntrySortKey);
排序目录项。
TEntry
概述
包装了一个目录项,它可以是目录、文件或卷标。每个目录项都用一个与它所属的目录和类型相关的名称,类型通过一个唯一的UID 指定。
TEntry 包装了目录以下信息:
1、目录项的类型:iType
2、目录项的属性:iAtt
3、目录项的大小
4、目录项的最后修改时间
TEntry API
1、TEntry()
IMPORT_C TEntry();
默认构造函数。
IMPORT_C TEntry(const TEntry &aEntry);
拷贝构造函数。
2、operator=()、operator[]()
IMPORT_C TEntry &operator=(const TEntry &aEntry);
赋值操作符。
inline const TUid &operator[](TInt anIndex) const;
获得文件3 个UID 中的1 个。
3、IsReadOnly()、IsHidden()、IsSystem()、IsArchive()、IsDir()
IMPORT_C TBool IsReadOnly() const;
判断文件或目录属性是否为只读。
IMPORT_C TBool IsHidden() const;
判断文件或目录属性是否为隐藏。
IMPORT_C TBool IsSystem() const;
判断文件或目录属性是否为系统。
IMPORT_C TBool IsArchive() const;
判断文件属性是否为只读。
IMPORT_C TBool IsDir() const;
判断目录项是否为目录。
4、iAtt、iSize、iModified、iType、iName
TUint iAtt;
目录项属性,每一个二进制位描述了一个属性。
TInt iSize;
目录项大小。
TTime iModified;
目录项最后修改时间
TUidType iType;
文件UID 类型
TBufC< KMaxFileName > iName;
目录项名称。
Symbian OS 文件服务器(五) — 文件名分析器
TParse
概述
分析文件名。该类使用Symbian OS 支持的全路径文件名结构。首先,TParse 使用Set() 函数建立需要分析的文件名。然后,使用多个在基类TParseBase 中定义的获取函数,如:FullName()、Drive()、Path()、DriveAndPath()、Name()、Ext() 和NameAndExt() 来获得路径的各个组成部分。
TParse API
1、TParse
IMPORT_C TParse();
默认构造函数。
2、Set()、SetNoWild()
IMPORT_C TInt Set(const TDesC &aName,
const TDesC *aRelated,
const TDesC *aDefault);
指定需要分析的文件名,文件名中允许使用通配符。aRelated 和aDefault 默认为NULL 。
IMPORT_C TInt SetNoWild(const TDesC &aName,
const TDesC *aRelated,
const TDesC *aDefault);
指定需要分析的文件名,文件名中不允许使用通配符。aRelated 和aDefault 默认为NULL 。
3、FullName()、Drive()、Path()、DriveAndPath()、
Name()、Ext()、 NameAndExt()
IMPORT_C const TDesC &FullName() const;
获得全路径文件名:drive-letter: /path/filename.extension
IMPORT_C TPtrC Drive() const;
获得驱动器字符:drive-letter:
IMPORT_C TPtrC Path() const;
获得路径:/path/
IMPORT_C TPtrC DriveAndPath() const;
获得驱动器字符和路径:drive-letter:/path/
IMPORT_C TPtrC Name() const;
获得文件名称:filename
IMPORT_C TPtrC Ext() const;
获得文件扩展名:.extension
IMPORT_C TPtrC NameAndExt() const;
获得文件名称和扩展名:filename.extension
4、PopDir()、AddDir()
IMPORT_C TInt PopDir();
将全名文件名中最后一个目录从路径中删除。用于导航到上一级目录中。
IMPORT_C TInt AddDir(const TDesC &aName);
在全名文件名的最后一个目录和文件名(如果有文件名的话)之间插入指定的目录,插入目录的开始和结尾处不能包含"/"。
5、DrivePresent()、PathPresent()、NamePresent()、ExtPresent()、
NameOrExtPresent()
IMPORT_C TBool DrivePresent() const;
判断由TParse::Set()、TParse::SetNoWild() 或RFs::Parse()
的aName 参数指定的全路径的驱动器是否存在。
IMPORT_C TBool PathPresent() const;
判断由TParse::Set()、TParse::SetNoWild() 或RFs::Parse()
的aName 参数指定的全路径的路径是否存在。
IMPORT_C TBool NamePresent() const;
判断由TParse::Set()、TParse::SetNoWild() 或RFs::Parse()
的aName 参数指定的全路径的名称是否存在。
IMPORT_C TBool ExtPresent() const;
判断由TParse::Set()、TParse::SetNoWild() 或RFs::Parse()
的aName 参数指定的全路径的扩展名是否存在。
IMPORT_C TBool NameOrExtPresent() const;
判断由TParse::Set()、TParse::SetNoWild() 或RFs::Parse()
的aName 参数指定的全路径的文件名或扩展名是否存在。
6、IsRoot()、IsWild()、IsNameWild()、 IsExtWild()
IMPORT_C TBool IsRoot() const;
判断经过分析后的全路径是否为根目录。
IMPORT_C TBool IsWild() const;
判断经过分析后的全路径中的文件名或扩展名是否包含通配符。
IMPORT_C TBool IsNameWild() const;
判断经过分析后的全路径中的文件名是否包含通配符。
IMPORT_C TBool IsExtWild() const;
判断经过分析后的全路径中的扩展名是否包含通配符。
Symbian OS 文件服务器(六) — 文件管理
http://blog.sina.com.cn/s/blog_448367c901009yls.html~type=v5_one&label=rela_nextarticle