现在的位置: 首页 > 综合 > 正文

遍历Symbian某目录下的所有文件

2013年01月23日 ⁄ 综合 ⁄ 共 4230字 ⁄ 字号 评论关闭

遍历Symbian某目录下的所有文件应该是Symbian中常用到的功能模块,比如你想写一个类似“程序管理器”的程序,那么首先的任务就是要先知道某目录下到底有那些文件,然后再筛选出你所需要的文件。

遍历Symbian某目录下的所有文件有两种方法

  我们首先学习点预备知识

查看SDK HELP中的GetDir()方法,你会看到如下的内容:

GetDir()

TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey, CDir*& anEntryList) const;

Description

Gets a filtered list of a directory's contents. The bitmask determines which file and directory entry types should be listed. The sort key determines the order in which they are listed.

注释

得到一个目录下内容的过滤列表。

anEntryAttMask决定哪个文件和目录应该被列出。

anEntrySortKey决定这些内容按照什么顺序列出。

Notes:

  • If sorting by UID (ESortByUid is OR'ed with the entry sort key), then UID information will be included in the listing whether or not KEntryAttAllowUid is specified in anEntryAttMask.(如果按照UID排序,即anEntrySortKey参数的值定义为ESortByUid。那么UID信息将被包含在列表中不管anEntryAttMask参数是否定义了KEntryAttAllowUid)

  • The function sets anEntryList to NULL, then allocates memory for it before appending entries to the list. Therefore, anEntryList should have no memory allocated to it before this function is called, otherwise this memory will become orphaned.(这个函数把anEntryList参数设置为NULL,然后在添加文件项到列表之前为anEntryList分配内存空间。因此,该函数调用之前anEntryList应该没有分配内存,否则这部分内存会变成垃圾而被遗弃)

  • The caller of this function is responsible for deleting anEntryList after the function has returned.(此函数的调用者有责任删除anEntryList在函数返回)

Parameters

const TDesC& aName

Name of the directory for which a listing is required. Wildcards may be used to specify particular files.

TUint anEntryAttMask

Bitmask indicating the attributes of interest. Only files and directories whose attributes match those specified here can be included in the listing. For more information see KEntryAttMatchMask and the other directory entry details. Also see KEntryAttNormal and the other file or directory attributes.

TUint anEntrySortKey

Flag indicating the order in which the entries are to be sorted. This flag is defined in TEntryKey.

CDir*& anEntryList

On return contains a list of directory and file entries.

Return value

TInt

KErrNone if successful, otherwise another of the system-wide error codes.

 

这是RFs类中的一个方法,从上面的SDK HELP内容我们可以看出:如果我们想获取某个目录下的所有内容,那么只需获取相应目录的CDir指针即可。

那么我们再看看CDir这个类的SDK HELP

Class CDir

CDir

Support

Supported from 5.0

Description

Array of directory entries that has been read into memory from the file system — abstract base class. It can be read and sorted by user programs, but cannot be created by them.

This class is not intended for user derivation.

注释:一个数组,这个数组的内容是从文件系统扫描到的目录,目录被缓存到内存中。它可以被我们的程序读取和排序,但是不能创建。

Derivation

o    CBase - Base class for all classes to be instantiated on the heap

§         CDir - Array of directory entries that has been read into memory from the file system — abstract base class

Members

Defined in CDir:
Count(), NewL(), Sort(), operator[](), ~CDir()

Inherited from CBase:
operator new()

    可见,这个类派生自CBase,并且继承了CBasenew()运算符。它里面只有5个方法,去处析构函数,实际上只有4个有用的方法。并且它里面重新定义了[]操作符,因为CDir本身是一个目录的数组。它还可以排序、可以计算数量,这些都是数组的基本特性。NewL()只不过也是一个重载的运算符而已。

    再看看operator[]()的定义:

operator[]()

const TEntry& operator[](TInt anIndex) const;

Description

Returns an entry from the array.

Parameters

TInt anIndex

Index of the desired entry within the array.

Return value

TEntry&

A directory entry.

    可以看出,通过[]操作符,CDir指针返回给我们的是一个目录的封装类TEntry

 

我们可以再跟踪一下TEntry这个类的SDK HELP

Class TEntry

TEntry

Support

Supported from 5.0

Description

Encapsulates an entry in a directory, which can be another (nested) directory, a file or a volume label. Each directory entry has a name which is relative to its owning directory and a type, which is indicated by its unique identifier (UID).

注释:封装目录中的一项内容,内容可以是另一个(嵌套的)目录、一个文件或者是一个驱动器卷标。每个目录项都有一个名字和类型与它的所属目录相关联,也就是UID所显示出来的东西。

An entry can be interrogated for the following properties:

一项内容可以被提取以下的属性:

·         the kind of entry: stored in the entry UIDs, stored in iType(项的类型:储存在UIDsiType)

·         the entry attributes, stored in iAtt(项的属性:储存在iAtt)

·         the size of entry(项的尺寸)

·         the time the entry was last modified(项上次被修改的时间)

Members

Defined in TEntry:
IsArchive(), IsDir(), IsHidden(), IsReadOnly(), IsSystem(), IsTypeValid(), IsUidPresent(), MostDerivedUid(), iAtt, iModified, iName, iSize, iType, operator[]()

See also:

    通过以上SDK HELP的内容,我们就知道了大概的方向,从而尝试写出了以下的程序:

void CCountEntryAppUi::ConstructL()

    {

    BaseConstructL();

 

    RFs iFs;

    User::LeaveIfError(iFs.Connect());

    _LIT(KDIR,"C://");

    CDir* dir; 

    User::LeaveIfError(iFs.GetDir(KDIR,KEntryAttNormal|KEntryAttMatchMask,ESortByDate,dir));

    TInt tempInt = dir->Count();

    for(int i = 0;i

    {

        TEntry& iEntry = (TEntry&)dir[i];

        TBufC iFileName = iEntry.iName;

    }

 

    delete dir;

    dir = NULL;

 

    iAppContainer = new (ELeave) CCountEntryContainer;

    iAppContainer->SetMopParent( this );

抱歉!评论已关闭.