`
totoxian
  • 浏览: 1073928 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

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

阅读更多

遍历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 < tempInt;i++)

{

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

TBufC<256> 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 < iCount;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

    • RSubSessionBase - Client-side handle to a sub-session

      • RFsBase - Base class that provides a Close() function for file related clean-up

        • RDir - Reads the entries contained in a directory

Members

Defined in RDir:
Open(), Open(), Read(), Read(), Read(), Read()

Inherited from RFsBase:
Close()

Inherited from RSubSessionBase:
CloseSubSession(), CreateSubSession(), Send(), SendReceive(), SubSessionHandle(), operator=()

看到这里,再和第一种方法进行比较,就应该很容易明白开头所给出的代码了,这段代码在VS2003+Carbide.vs+ S60_2nd_FP2_SC SDK中也编译通过.

分享到:
评论

相关推荐

    遍历目录下所有的文件_遍历文件夹文件_java遍历目录下所有文件_

    在Java编程语言中,遍历一个目录下的所有文件和子目录是一项常见的任务,尤其是在处理文件系统操作时。这里我们将深入探讨如何使用Java API来实现这一功能,并解释相关的知识点。 首先,Java提供了`java.io.File`类...

    遍历目录及目录下的文件.vbs

    遍历目录及目录下的文件遍历目录及目录下的文件

    遍历网站某个目录下的所有文件

    遍历网站某个目录下的所有文件,本地测试没有问题,一下F盘所有都可以看到,不过文件太多了,打开有点慢哦,哈哈!

    C# 遍历指定目录下的所有文件和目录

    在C#编程中,遍历指定目录下的所有文件和子目录是一项常见的任务,这通常用于文件管理和系统操作。本文将详细讲解如何使用C#来实现这一功能,以及相关的知识点。 首先,我们需要引入`System.IO`命名空间,这个命名...

    遍历删除文件夹下所有文件及目录

    "QT遍历删除文件夹下所有文件及目录" 在QT应用程序中,需要遍历删除文件夹下所有文件及目录是一种常见的操作。本文将详细介绍如何使用QT框架实现该功能。 一、使用QDir和QFileInfo遍历删除文件夹 在QT中,可以...

    易语言遍历目录文件

    遍历目录文件,即程序会按照一定的顺序访问指定目录下的所有文件和子目录,读取它们的信息,包括文件名、大小、创建日期等。这个过程通常通过循环结构和系统调用来完成。 在易语言中,遍历目录文件主要涉及到以下...

    Javascript如何遍历一个文件夹下的所有文件与目录

    ### JavaScript遍历文件夹下的所有文件与目录 在JavaScript中,遍历文件夹下的所有文件与目录是一项常见的任务,尤其是在需要处理本地文件系统时。本文将详细介绍如何使用`Scripting.FileSystemObject`对象来实现这...

    遍历目录下所有文件及大小(包括文件夹内文件)

    遍历目录下所有文件,下载后请修改需要遍历的目录,遍历后形成list.txt文件显示所有文件和文件大小

    c#遍历指定文件夹中的所有文件

    C#遍历指定文件夹中的所有文件是指使用C#语言编写程序来遍历指定文件夹中的所有文件和子目录。下面 将详细介绍如何使用C#来实现这一功能。 首先,需要使用DirectoryInfo类来表示文件夹。DirectoryInfo类提供了许多...

    遍历一个目录下的所有文件(VC++6.0源代码)

    在编程领域,尤其是在Windows系统上开发应用程序时,有时我们需要遍历一个特定目录及其子目录下的所有文件,以便进行文件操作、文件查找或者文件管理。在本案例中,我们关注的是如何使用VC++6.0来实现这个功能。VC++...

    遍历磁盘目录,遍历所有文件

    在IT领域,遍历磁盘目录并访问所有文件是一项基础且重要的任务,它涉及到操作系统、文件系统和编程语言等多个方面。这项操作常用于文件管理、数据备份、病毒扫描等多种场景。下面将详细介绍如何实现这个功能,并结合...

    C++遍历指定文件夹中的所有文件

    ### C++遍历指定文件夹中的所有文件 在C++编程语言中,有时我们需要实现对文件系统的操作,比如遍历指定文件夹中的所有文件。这种功能对于开发文件管理器、备份软件等应用非常实用。本文将详细介绍如何使用C++来...

    java中遍历某个目录下的所有文件及文件夹中的文件

    在Java开发中,经常会遇到需要遍历指定目录及其子目录下所有文件的情况。本文将详细介绍如何使用Java标准库中的`java.io.File`类来实现这一功能。我们将通过一个简单的递归函数来演示如何遍历目录、列出所有文件的...

    QT creator遍历目录下的所有文件方法

    在进行文件系统操作时,有时我们需要遍历指定目录下的所有文件,这在处理文件系统任务时非常常见。QT Creator提供了便利的API来实现这个功能,主要涉及到QDir类和其成员函数。 在QT中,`QDir`类是用于处理目录和...

    c++遍历文件夹及其子文件夹所有文件 并输出文件路径和文件内容

    这个程序不仅遍历了指定目录下的所有文件,还递归地处理了子目录。同时,它还输出了每个文件的完整路径和内容。如果你需要在其他操作系统(如Linux或MacOS)上运行,只需确保你的编译器支持`std::filesystem`库,...

    VC++ 遍历FTP文件目录

    本文将深入探讨如何利用VC++遍历FTP文件目录,结合Socket编程和文件操作SDK来实现这一功能。 首先,FTP是一种用于在网络上进行文件传输的标准协议,它允许用户从远程主机上下载文件或上传文件到远程主机。在VC++中...

    MFC读取文件夹并且遍历该文件下面的所有文件

    在MFC(Microsoft Foundation Classes)环境下,开发C++应用程序时,常常需要处理文件系统操作,例如读取文件夹以及遍历其下的所有文件和子文件夹。本篇将详细讲解如何实现这一功能,并提供相关代码示例。 首先,...

    Linux-C++-遍历指定文件夹路径下的文件列表并将路径写到txt文件

    本教程将探讨如何遍历指定文件夹路径下的所有文件,并将这些文件的路径写入一个TXT文本文件。这在处理大量数据或者需要自动化文件管理时非常有用。 首先,我们需要了解Linux系统中的文件路径和文件操作的基本概念。...

    遍历文件目录下所有文件

    java代码,遍历文件目录下所有的文件并列出其名称。新手代码,如有冒犯,请多指教

    遍历某文件夹下的 .txt 文件

    使用 `listFiles()` 方法获取该目录下的所有文件和子目录。 3. 遍历这些文件/子目录: - 如果是目录,则递归调用 `getFiles()` 方法继续遍历。 - 如果是文件且其扩展名为指定的 `fileSuffix`,则将该文件添加到 ...

Global site tag (gtag.js) - Google Analytics