用户: 密码: 答案:   我要注册   忘记密码

加入收藏  设为首页

开发文档

CNJM首页

业界新闻

手机软件

终端应用

资源下载

EclipseME

CNJM论坛

                 

频道列表

J2ME开发 176篇
服务器端开发 33篇
JAVA语言 70篇
游戏与图形 101篇
WindowsMobile开发 6篇
Symbian开发 61篇
Brew开发 36篇
其它开发平台 6篇

热点文章

向大家推荐几个比...  16526次
[推荐]symbian入门... 10131次
制作sis文件全攻略 9051次
Symbian Series60...  7894次
写给symbian os开...  7763次
[转帖]Symbian OS ... 7583次
Series 60图形开发... 7547次
在.pkg中定义条件...  7264次
请问有大虾知道如...  7043次
连载:Series 60应...  7002次
在Symbian OS中读...  6738次
蔡鸟的一些学习笔...  6277次

文章搜索

搜 索
按 照
频 道
  
在Symbian OS中读取ZIP文件
编辑:rocks    审核:rocks    文章来源:CSDN
关键词:symbian    发表日期:2006-02-17 13:29:09    浏览次数:6739次
本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net>
来自:http://www.cnjm.net/tech/article860.html

[转载于CSDN]
JAVA手机网[www.cnjm.net]

JAVA手机网[www.cnjm.net]
如今最普遍的压缩文件格式就要算ZIP了,它最开始是Phil Katz借鉴ARC格式创建的。Symbian OS提供了一个名为CzipFile的类来读取ZIP文件,它从Symbian 7.X开始被支持。这篇文章将告诉你如何使用CzipFile并给出一个例子。你可以在Series 60 2.x or UIQ 2.x环境下编译,运行这个例子。
虽然SDK文档中有CzipFile的介绍,但还是远远不够的,并且没有例子告诉你如何使用它,这也是我写这篇文章的原因。希望它对你有所帮助。
一、读取ZIP文件
JAVA手机网[www.cnjm.net]
我们以一种简单的情况开始:打开ZIP文件并显示其内部所有文件的信息。首先,我们需要创建一个新的CzipFile 实例。下面是你可以使用的已封装好的两阶段构造函数:

CZipFile* zipFile = CZipFile::NewL(fileSession, aCompressedFile);
CleanupStack::PushL(zipFile);

JAVA手机网[www.cnjm.net]
构造函数的第一个参数是文件服务器的会话,第二个参数是ZIP文件的名字。
JAVA手机网[www.cnjm.net]
下面,我们要得到ZIP文件的迭代器(iterator)来遍历其中的文件,可以通过调用CZipFile::GetMembersL()实现,它返回一个CzipFileMemberIterator类的实例。

CZipFileMemberIterator* members = zipFile->GetMembersL();
CleanupStack::PushL(members);

注意member的所有权已传递到调用者,因此我们在使用完之后需要删除它。
现在,我们怎么得到每一个文件的实例呢?可以调用CZipFileMemberIterator::NextL()进行遍历直到它返回0为止(返回0意为着没有文件了)。看下面的代码:

CZipFileMember* member;
while ((member = members->NextL()) != 0)
{
console->Printf(
KInfoMessage,
JAVA手机网[www.cnjm.net]
member->Name(),
member->CompressedSize(), member->UncompressedSize());

delete member;

}

上面的代码打印了ZIP文件中所有文件的名字,压缩后的大小和未压缩的大小。再次注意我们需要删除member,因为我们已经是它的拥有者了。
最后,别忘了释放我们分配的任何资源:

CleanupStack::PopAndDestroy(); // members
CleanupStack::PopAndDestroy(); // zipFile

如果我们有一个含有3个文件的ZIP文件,例如:Example.txt, Example.dat and Example.png。程序的输出就像下面这样(你可以在文章的最后下载这个例子):

JAVA手机网[www.cnjm.net]
Example.txt - 11 - 11
Example.dat - 15 - 180
Example.png - 4393 – 4393

二、从ZIP文件中提取文件
这段将展示如何从ZIP文件中提取文件。和前面的例子一样,第一步需要创建CzipFile的实例:

CZipFile* zipFile = CZipFile::NewL(fileSession, aCompressedFile);
CleanupStack::PushL(zipFile);

这里我们不再需要一个迭代器,因为我们对一个指定的文件感兴趣,需要调用的方法是CZipFile::CaseInsensitiveMemberL()。这个方法需要一个你想访问文件的名字做为参数:

CZipFileMember* member = zipFile->CaseInsensitiveMemberL(aFileName);
CleanupStack::PushL(member);

下面这步将得到输入流并使用Read()方法提取文件,ZIP文件中的文件输入流使用RzipFileMemberReaderStream类,得到输入流的方法是调用CZipFile::GetInputStreamL():

RZipFileMemberReaderStream* stream;
zipFile->GetInputStreamL(member, stream);
CleanupStack::PushL(stream);

下面的代码展示如何读取文件,在读文件之前,代码分配了一个文件未压缩大小的buffer(member->UncompressesedSize() )用来存储文件。

HBufC8* buffer = HBufC8::NewLC(member->UncompressedSize());
TPtr8 bufferPtr(buffer->Des());
User::LeaveIfError(stream->Read(bufferPtr, member->UncompressedSize()));

如果你的文件很大,不要像上面那样通过一次Read()读取所有数据,它会阻塞你的程序。可以通过一个活动对象一块块的读取数据代替上面的方法。例子中使用一次Read()只是为了演示的简单性。
现在我们把文件读到了一个buffer中,你可以立刻使用它,或者选择以文件的形式保存。下面的代码把它保存到文件:

RFile file;
User::LeaveIfError(file.Replace(fileSession, fileName, EFileWrite));
CleanupClosePushL(file);
User::LeaveIfError(file.Write(*buffer));
fileSession.Close();

最后,别忘了释放所有分配的资源:

CleanupStack::PopAndDestroy(5); // file, buffer, stream, member, zipFile

三、例子
例子完成两件事:
1. 显示Example.zip文件中所有的文件的信息。它在IteratorExampleL()函数中实现。
2. 从Example.zip中提取Example.txt并保存到设备的c:\data\Example.txt。它在ExtractionExampleL()函数中实现。

下载地址:
JAVA手机网[www.cnjm.net]
http://www.antonypranata.com/articles/download/ZipExample.zip
http://www.newlc.com/IMG/zip/ZipExample.zip
来自:http://www.cnjm.net/tech/article860.html

相关文章
    给Symbian的模拟器换皮肤(换成我们喜欢的手机皮肤)  [2007-07-08]
    编写安全的Symbian C++游戏代码  [2007-07-07]
    Symbian将在中国开设分公司  [2007-01-11]
    Skype首度支持S60手机 微软独占优势不再  [2006-02-23]
    Symbian Series60上实现混音的办法  [2006-02-23]
    2010年微软和Linux智能手机将超越Symbian  [2006-02-23]
    在.pkg中定义条件判断60系列平台的版本  [2006-02-17]
最新评论
网站简介  |  关于版权  |  广告服务  |  网站地图  |  联系我们
Copyright © www.CNJM.net, All rights reserved
中国JAVA手机网 版权所有
ICP备案:京ICP备041452