惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Scott Helme
Scott Helme
N
Netflix TechBlog - Medium
AI
AI
Security Latest
Security Latest
GbyAI
GbyAI
P
Proofpoint News Feed
Y
Y Combinator Blog
A
Arctic Wolf
G
Google Developers Blog
U
Unit 42
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
Cisco Talos Blog
Cisco Talos Blog
T
Tor Project blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
C
Check Point Blog
B
Blog RSS Feed
The GitHub Blog
The GitHub Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Microsoft Security Blog
Microsoft Security Blog
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
Latest news
Latest news
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
WordPress大学
WordPress大学
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
The Hacker News
The Hacker News
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
Project Zero
Project Zero
博客园_首页

博客园 - Icebird

谈谈批处理文件里的注释 用户中心 - 博客园 Password for ReportBuilder Enterprise v10.08 Retail For Delphi 7-Lz0 [Delphi] DUnitID 0.17.4725 RSSReader JavaScript Edition [Delphi] GetClass与RegisterClass的应用一例 DelForEx v2.5 for Delphi 2007 我的Delphi开发经验谈 JBookManager v1.00.2008314 (编辑管理您的Jar电子书) Windows优化大师的一点研究 [Delphi] 发布QuickenPanel Component LINQ to JavaScript [PowerShell] SFV生成与校验 [PowerShell] 将rar文件转换为zip格式 [PowerShell] GBK简繁转换 [PowerShell] PowerShell学习脚印 JavaScript测试页面 DevExpress ExpressScheduler 快速编译批处理文件 备份工具 SmartBackup的源代码
在.NET中使用PhysFS来挂载压缩包(zip)
Icebird · 2011-04-11 · via 博客园 - Icebird

  PhysicsFS is a library to provide abstract access to various archives. It is intended for use in video games, and the design was somewhat inspired by Quake 3's file subsystem. The programmer defines a "write directory" on the physical filesystem. No file writing done through the PhysicsFS API can leave that write directory, for security. For example, an embedded scripting language cannot write outside of this path if it uses PhysFS for all of its I/O, which means that untrusted scripts can run more safely. Symbolic links can be disabled as well, for added safety. For file reading, the programmer lists directories and archives that form a "search path". Once the search path is defined, it becomes a single, transparent hierarchical filesystem. This makes for easy access to ZIP files in the same way as you access a file directly on the disk, and it makes it easy to ship a new archive that will override a previous archive on a per-file basis. Finally, PhysicsFS gives you platform-abstracted means to determine if CD-ROMs are available, the user's home directory, where in the real filesystem your program is running, etc.

  我是从改版的DOSBox里看到有这样一个技术可以实现挂载zip/7z压缩包,就想在.NET中是否能够使用呢。

  让我找到一个封装好的库 - BooGame,另外还有一个TAO (文件太大,有30多M)。

  首先下载BooGame: http://sourceforge.net/projects/boogame/files/BooGame/

  从下载的包里找到physfs.dll与Tao.PhysFs.dll,新建项目,引用Tao.PhysFs.dll,将physfs.dll放入bin与执行文件在一起。

  然后using Tao.PhysFs,BooGame里有一个FileSystem.cs,可以做参考,不过其封装得不够完善。

  首先 Fs.PHYSFS_init("init"); //这里的"init"没啥特别意义,总之传入一个字符串就可以

  然后是添加搜索路径,Fs.PHYSFS_addToSearchPath("D:\\Temp", 1); //如果有写入要求的话,写入的临时目录要先添加,否则修改过的数据无法被找到,后面的参数1是一个定值

  下面来mount一个压缩包,Fs.PHYSFS_addToSearchPath("D:\\Test.zip", 1);

  接着设置写入的临时目录:Fs.PHYSFS_setWriteDir("D:\\"); //对压缩包的文件所作的任何修改都会被存入此处指定的临时目录。

  如果临时目录与压缩包里的同一路径下都有相同的文件,则搜索路径在前的那个文件会优先被使用。

  接下来就是文件目录的通常操作了,除了是使用 Fs.PHYSFS_XXX 这样的语句外,与通常的文件操作没有太大区别。更详细的使用帮助,请参考http://192.121.234.229/manualer/programering/Tao-doc/Tao.PhysFs/Tao.PhysFs.FsMembers.html

  有心的话,可以考虑继承Steam重写一个类来简化使用。

  提示,里面的openWrite, openAppend实在不好用(需要Marshal.AllocHGlobal来分配内存),不如直接在临时目录下直接读写之。

  最后,要关闭资源:Fs.PHYSFS_deinit();

  PS: 这个版本有点老了,好像是1.0.1,现在最新的是2.0.2,从1.1开始就支持了7z格式。

  都快写完了,突思奇想,把DOSBox里带的libphysfs.dll复制过来,改名成physfs.dll,然后一试,哈哈,果然可以使用,并且支持了7z格式。

  相关文件下载:https://files.cnblogs.com/Icebird/PhysFS.net.rar