遍历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:
Parameters
|
Return value
|
这是RFs
类中的一个方法,从上面的SDK HELP内容我们可以看出:如果我们想获取某个目录下的所有内容,那么只需获取相应目录的CDir指针即可。
Class |
|
Return value
|
可以看出,通过[]操作符,CDir指针返回给我们的是一个目录的封装类
TEntry。
我们可以再跟踪一下TEntry这个类的SDK HELP: Class |
通过以上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 );
iAppContainer->ConstructL( ClientRect() );
AddToStackL( iAppContainer );
}
通过设置断点进行观察,可以看到如下结果:
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 2in; HEIGHT: 192pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5Cuser%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png" o:title="1"></imagedata></shape>
而Symbian系统C盘下的文件内容如下:
<shape id="_x0000_i1026" style="WIDTH: 2in; HEIGHT: 192pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5Cuser%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png" o:title="2"></imagedata></shape>
可见,此时程序所读取到的文件数目是正确的。
② 下面我们来看第二中获取Symbian某目录下所有文件的方法,其基本原理是类似的,只不过是调用了不同的接口而已。
RFs iFs;
User::LeaveIfError(iFs.Connect());
_LIT(KDIR,"C:\\");
RDir oDir;
oDir.Open(iFs, KDIR, KEntryAttNormal);
TEntryArray* oArray = new (ELeave) TEntryArray;
oDir.Read(*oArray);
TInt iCount = oArray->Count();
for(TInt i = 0;i
{
TEntry temp = (*oArray)[i];
TName iTemp = temp.iName;
if(i == 2)
CEikonEnv::Static()->InfoMsg(iTemp);
}
iFs.Close();
和第一种方法不同的是,这里使用了RDir类作为目录项的存放数组。我们看看SDK HELP中这个类的帮助文档:
RDir Support Supported from 5.0 Description Reads the entries contained in a directory. 读取一个目录中所包含的项,包括目录、文件以及驱动器卷标,这一点和上面的CDir类是一样的。 You must first open the directory, specifying an attribute mask which is used by Read() calls to filter the entry types required. Then, use one of the Read() functions to read the filtered entries. When the operation is complete, the directory should be closed using Close(), defined in the base class RFsBase. 你必须先打开目录,定义一个属性掩码用来过滤项类型。然后用Read()函数去读取过滤的项。当操作完成时,目录应该调用基类RFsBase中定义的Close()方法关闭。 There are two types of Read(): one works with a single entry at a time, requiring programs to iterate through the entries explicitly. The other works with an entire TEntryArray, allowing multiple entries to be read in one call. As well as making application program logic somewhat simpler, this type uses fewer calls to the server, and is more efficient. 有两种版本的Read()方法:一种是每次读取一个目录项,要求遍历所有目录项。另一种利用一个TEntryArray工作,它允许多个目录项一次读取完。为了让应用程序逻辑简单,这种类型和服务器的交互少,并且非常高效。 Each type of Read() can be performed either synchronously or asynchronously. 每种版本的Read()方法都可以表现为同步的或者异步的。 It may be more convenient to use RFs::GetDir() than the Read() calls supported by this class. RFs::GetDir() has the advantage that it allows a directory's entries to be sorted in various ways. However, it does not provide asynchronous as well as synchronous variants and does not allow entries to be read individually. RFs::GetDir()比这个类所提供的方法更方便,而且RFs::GetDir()允许一个目录的项以不同的方式排序。尽管如此,RFs::GetDir()却不区分同步、异步的方式,并且不允许目录项逐个的读取。 Derivation
Members Defined in RDir: Inherited from RFsBase: Inherited from RSubSessionBase: |
看到这里,再和第一种方法进行比较,就应该很容易明白开头所给出的代码了,这段代码在VS2003+Carbide.vs+ S60_2nd_FP2_SC SDK中也编译通过.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1614515