幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3321|回复: 7

[通用编程] 使用std.zip 编写文件打包管理器:)

[复制链接]

1

主题

12

帖子

161

积分

③业余

积分
161
发表于 2007-5-9 22:56:10 | 显示全部楼层 |阅读模式
这里有D语言的专区啊。真是不错。。我也随便发一贴好了。。
关于std.zip 包,这个包使用std.zlib作为其zip支持,且使用OO的方法封装了zip的压缩和解压缩,非常方便。这里对其方法就不详细讲解了。可以去看D主页的说明。我们可以使用这个东西,从zip文件(也可以伪装成。dat哦)里面加载文件数据,如果使用sdl的话可以用sdl的rwops结构加载数据就可以在zip文件里面加载资源了。
我把我的写的ResourceLoader贴出来。由于我是D的新手可能写的不好,请大家多原谅。。
  1. module YDGE.Engine.ResourceLoader;
  2. import std.stdio;
  3. import std.file;
  4. import std.zip;
  5. class ResourceLoader
  6. {
  7.     // constructor
  8.     public
  9.     {
  10.         this ()
  11.         {
  12.         }
  13.     }
  14.     // functions
  15.     public
  16.     {
  17.         bool addArchive(char [] fileName)
  18.         {
  19.             // if the file is already in list
  20.             if ((fileName in dataList) != null)
  21.                 return false;
  22.             // try to open the file
  23.             void [] data;
  24.             ZipArchive archive;
  25.             try
  26.             {
  27.                 data = read(fileName);
  28.             }
  29.             catch (Exception e)
  30.             {
  31.                 writefln("Error in opening file :", fileName);
  32.                 return false;
  33.             }
  34.             try
  35.             {
  36.                 archive = new ZipArchive(data);
  37.             }
  38.             catch (Exception e)
  39.             {
  40.                 writefln("Error in create zip archive :",fileName);
  41.                 return false;
  42.             }
  43.             // insert the file
  44.             dataList[fileName] = archive;
  45.             return true;
  46.         }
  47.         bool removeArchive(char [] fileName)
  48.         {
  49.             // if the file is not in the list
  50.             if ((fileName in dataList) == null)
  51.                 return false;
  52.             dataList.remove(fileName);
  53.             return true;
  54.         }
  55.         ubyte [] loadResource(char [] fileName)
  56.         {
  57.             ubyte [] data;
  58.             // try to load the real file first
  59.             try
  60.             {
  61.                 data = cast (ubyte[]) (read(fileName));
  62.             }
  63.             catch (Exception e)
  64.             {
  65.                 // load from the archives
  66.                 ZipArchive [] archives = dataList.values;
  67.                 int i;
  68.                 for (i = 0; i < archives.length; i++)
  69.                 {
  70.                     bool find = false;
  71.                     foreach (ArchiveMember am; archives[i].directory)
  72.                     {
  73.                         if (am.name == fileName)
  74.                         {
  75.                             data = (archives[i].expand(am));
  76.                             find = true;
  77.                             break;
  78.                         }
  79.                     }
  80.                     if (find == true)
  81.                         break;
  82.                 }
  83.                 if (i == archives.length)
  84.                     data = null;
  85.             }
  86.             return data;
  87.         }
  88.         ubyte [] loadResource(char [] archiveName,char [] fileName)
  89.         {
  90.             if ((archiveName in dataList) == null)
  91.             {
  92.                 // try to add the archive to the list
  93.                 if (addArchive(archiveName) == false)
  94.                     return null;
  95.             }
  96.             ZipArchive archive = dataList[archiveName];
  97.             foreach (ArchiveMember am; archive.directory)
  98.             {
  99.                 if (am.name == fileName)
  100.                 {
  101.                     return (archive.expand(am));
  102.                 }
  103.             }
  104.             return null;
  105.         }
  106.     }
  107.     // data
  108.     private
  109.     {
  110.         ZipArchive [char []] dataList;
  111.     }
  112. }
复制代码
回复

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-5-9 23:29:19 | 显示全部楼层
话说……那啥……最近看到的一个ZIP的那个……好烦- -

相比这个好多了- -~

感觉就和JAVA那种感觉了,都被做到内置里面去了…………~~ [s:6]
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2007-5-10 10:57:17 | 显示全部楼层
不错的例子,学习学习。

ps.
这就是类库的威力啊,可惜d在这方面作得还不是很好。
语法使用上和c差不多,类写起来比c++方便得多得多。
所以才看到d的时候,就毫不犹豫的选择了它。
反正我不是专业程序员,不在乎主流不主流,只在乎自己爽不爽。 [s:1]
え~え~お!!!
回复 支持 反对

使用道具 举报

9

主题

1512

帖子

9136

积分

荣誉群

Cod3r

积分
9136

终身成就奖

发表于 2007-5-12 02:16:55 | 显示全部楼层
我記得在BMax上為了讓文件直接讀到Memory Stream是件多麼繁瑣的過程...
我目前是用PhysicsFS處理這工作(因為BMax直接支持gcc),
但我還不知道如何用虛擬文件系統處理緩衝。
(\\__/) (O.o ) (> < ) This is Bunny.
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-5-12 18:00:11 | 显示全部楼层
booST貌似有一个文件系统FILESYSTEM,不过偶没有看过,

另外在游戏开发的时候为什么需要使用VFS呢?把所有的文件打为一个数据包,然后就直接读取是不是就可以了?? [s:7]
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2007-5-12 20:55:50 | 显示全部楼层
所有资源打一个超大的包,std.steam来读入后,用指针来指示具体文件的偏移位置?
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-5-12 23:41:06 | 显示全部楼层
那个大概都是单个目录的巴,估计VFS主要用来划分资源的层次………………
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2007-5-13 10:32:27 | 显示全部楼层
我觉得单目录也没什么不好的。
把里面的文件命名成这样 pic0001.jpg,snd0001.ogg,就和用pic,snd两个目录来区分差不多了。
え~え~お!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-28 21:57 , Processed in 0.025011 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表