在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
以上列表中的文件并不是来自于某个文件夹中的所有jpg文件,而是来自于 这个文件。 一个管理器类,提供一些外围的方法 PackFile类作为PackFileManager的嵌套类,它提供包文件的属性和施工细节。 复制代码 代码如下: public void Build(string path) { using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)) { BinaryWriter bw = new BinaryWriter(fs); bw.Write("PackFile"); bw.Write(this._pathList.Count); foreach (string f in this._pathList) { FileInfo fi = new FileInfo(f); bw.Write(fi.Length); fi = null; } foreach (string f in this._pathList) { bw.Write(Path.GetFileName(f)); } foreach (string f in this._pathList) { bw.Write(File.ReadAllBytes(f)); bw.Flush(); } } } 1. 先写个“PackFile”字符串到文件头 2. 把以Int32为类型的,要输出到包文件中的文件数量写入 3. 把以long为类型的,要输出到包文件中的每个文件的长度写入。 4. 再把每个文件名写入 5. 最后写入每个文件的实体内容。 由于在写或读时不频繁在Write方法或ReadXXX方法的不同版本间频繁切换,所以我想这样组织文件结构可以更高效一些。 疑问来了。在写入文件名的时候,我们使用bw.Write(Path.GetFileName(f)); 复制代码 代码如下: PackFileManager的LoadPackFile方法 public void LoadPackFile(string path) { if (!File.Exists(path)) { throw new FileNotFoundException(path); } if (_pf != null) { _pf.Close(); _pf = null; } FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); if (br.ReadString() != "PackFile") { throw new InvalidCoalescentFileException("该文件不是有效的包文件"); } this._pf = new PackFile(fs,br); } 此时,我们在生成时写入的字符串"PackFile" 就有了明确的功能 PackFile的构造函数 复制代码 代码如下: internal PackFile(FileStream srcFile,BinaryReader br) { this._sourceFile = srcFile; _br = br; this._fileCount = _br.ReadInt32();//取文件数 for (int i = 1; i <= _fileCount; i++) { this._fileLengthList.Add(_br.ReadInt64()); } for (int i = 1; i <= _fileCount; i++) { this._shortNameList.Add(_br.ReadString()); } this._contentStartPos = _sourceFile.Position;//设置实体文件总起始位置 } PackFile.GetBytes() 复制代码 代码如下: public byte[] GetBytes(int index) { long startPos = this._contentStartPos; for (int i = 0; i < index; i++) { startPos += this._fileLengthList[i]; } _sourceFile.Position = startPos; //设置某文件内容的起始位置 return _br.ReadBytes((int)_fileLengthList[index]); } 这只是一个草案,我们还可以加入压缩、或是像ZIP文件那样的嵌套文件夹功能,改进后的代码别忘与我分享哦。 |
请发表评论