成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實現(xiàn).NET文件合并

開發(fā) 后端
今天我們將介紹的是.NET文件合并,通過這些功能將多個文件合并為一個文件。這些功能是十分有用的。

以上列表中的文件并不是來自于某個文件夾中的所有jpg文件,而是來自于

這個文件。

將多個文件合并為一個文件在許多應(yīng)用領(lǐng)域都十分有用。親自實現(xiàn)這樣一個程序一定不但過癮且在許多時候可以幫助我們構(gòu)建更高效的程序。這里我做了一個方案例分享給大家。

由于合并后的文件就像一個包裹,所以下文中都把這樣的文件稱為“包文件”

主構(gòu)思:

要把多個文件合并成一個包文件,還要可以區(qū)分其中的某個文件并提取出來。我們需要知道文件的名稱和這個文件在包文件中的位置及長度,也就是所謂的地址偏移。

由于包文件常常會比較大,所以不應(yīng)該讓它的內(nèi)容常駐于內(nèi)存,只應(yīng)該需要某部分的時候再從包文件中提取。

我是這樣做的:

一個管理器類,提供一些外圍的方法

_pathList用于存放要添加到包文件的文件路徑,通過調(diào)用AddSourceFile()方法添加

_pf 是具體的包文件,通過LoadPackFile() 生成實例,通過CurrentPackFile屬性返回

Build方法用于生成包文件

PackFile類作為PackFileManager的嵌套類,它提供包文件的屬性和施工細節(jié)。

好了,我們先來看看PackFileManager.Build()方法

  1. public void Build(string path)  
  2.  
  3.  using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))  
  4.  {  
  5.      BinaryWriter bw = new BinaryWriter(fs);  
  6.      bw.Write("PackFile");  
  7.     bw.Write(this._pathList.Count);  
  8.      foreach (string f in this._pathList)  
  9.      {  
  10.          FileInfo fi = new FileInfo(f);  
  11.          bw.Write(fi.Length);  
  12.          fi = null;  
  13.      }  
  14.      foreach (string f in this._pathList)  
  15.      {  
  16.          bw.Write(Path.GetFileName(f));  
  17.      }  
  18.      foreach (string f in this._pathList)  
  19.      {  
  20.          bw.Write(File.ReadAllBytes(f));  
  21.          bw.Flush();  
  22.      }  
  23.  }  

1. 先寫個“PackFile”字符串到文件頭

2. 把以Int32為類型的,要輸出到包文件中的文件數(shù)量寫入

3. 把以long為類型的,要輸出到包文件中的每個文件的長度寫入。

4. 再把每個文件名寫入

5. ***寫入每個文件的實體內(nèi)容。

由于在寫或讀時不頻繁在Write方法或ReadXXX方法的不同版本間頻繁切換,所以我想這樣組織文件結(jié)構(gòu)可以更高效一些。

疑問來了。在寫入文件名的時候,我們使用bw.Write(Path.GetFileName(f));

調(diào)用了BinaryWriter.Write(string value),傳入的是字符串,那么在讀取的時候要調(diào)用BinaryReader.ReadString()。這時它是如何區(qū)分兩個字符串邊界的。還好,Write方法會先將字符串長度作為一個四字節(jié)無符號整數(shù)寫入,于是在用BinaryReader.ReadString()的時候它會根據(jù)這個值來讀取特定長度的值,并理解為字符串。

這里列出幾個重要方法:

PackFileManager的LoadPackFile方法

  1. public void LoadPackFile(string path)  
  2.  {  
  3.      if (!File.Exists(path))  
  4.      {  
  5.          throw new FileNotFoundException(path);  
  6.      }  
  7.      if (_pf != null)  
  8.      {  
  9.          _pf.Close();  
  10.          _pf = null;  
  11.      }  
  12.      FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);  
  13.      BinaryReader br = new BinaryReader(fs);  
  14.      if (br.ReadString() != "PackFile")  
  15.      {  
  16.          throw new InvalidCoalescentFileException("該文件不是有效的包文件");  
  17.      }  
  18.      this._pf = new PackFile(fs,br);  
  19.  } 

此時,我們在生成時寫入的字符串"PackFile" 就有了明確的功能

PackFile的構(gòu)造函數(shù)

  1. internal PackFile(FileStream srcFile,BinaryReader br)  
  2.     {  
  3.         this._sourceFile = srcFile;  
  4.         _br = br;  
  5.         this._fileCount = _br.ReadInt32();//取文件數(shù)  
  6.         for (int i = 1; i <= _fileCount; i++)  
  7.         {  
  8.             this._fileLengthList.Add(_br.ReadInt64());  
  9.         }  
  10.         for (int i = 1; i <= _fileCount; i++)  
  11.         {  
  12.             this._shortNameList.Add(_br.ReadString());  
  13.         }  
  14.         this._contentStartPos = _sourceFile.Position;//設(shè)置實體文件總起始位置  
  15.     }  
  16. .GetBytes()  
  17.     public byte[] GetBytes(int index)  
  18.     {  
  19.         long startPos = this._contentStartPos;  
  20.         for (int i = 0; i < index; i++)  
  21.         {  
  22.             startPos += this._fileLengthList[i];  
  23.         }  
  24.         _sourceFile.Position = startPos; //設(shè)置某文件內(nèi)容的起始位置  
  25.         return _br.ReadBytes((int)_fileLengthList[index]);  
  26.     } 

這只是一個草案,我們還可以加入壓縮、或是像ZIP文件那樣的嵌套文件夾功能,改進后的代碼別忘與我分享哦。

代碼下載:測試并合文件

我們來總結(jié)一下:

縱觀代碼可以發(fā)現(xiàn),核心功能都在圍繞“偏移位置”與“長度”兩個概念,這在數(shù)據(jù)結(jié)構(gòu)中很重要。同時,這也提醒了我們?yōu)槭裁丛跀?shù)據(jù)庫表字段中,作為主鍵的只能是“定長”類型,而不能是“變長”類型。

原文鏈接:http://www.cnblogs.com/cyclone-dll/archive/2010/12/28/1918808.html

【編輯推薦】

  1. C#取整函數(shù)實例應(yīng)用詳解
  2. C#單元測試的一個小故事
  3. C#單元測試概念及作用的淺析
  4. C#單元測試使用的必要性的淺析
  5. C#單元測試的運行淺析
責任編輯:彭凡 來源: 博客園
相關(guān)推薦

2010-01-14 11:00:48

VB.NET文件合并

2010-01-18 16:33:57

VB.NET加密文件

2010-01-20 13:42:10

VB.NET訪問INIGetPrivateP

2011-03-30 15:16:27

VB.NET.NETXML

2009-07-24 10:23:07

WORD文件轉(zhuǎn)換PDFASP.NET

2011-04-06 09:30:52

.NET

2024-06-20 08:09:24

2010-01-07 13:40:50

VB.NET讀取XML

2009-11-03 13:16:58

VB.NET讀取文件

2010-01-13 14:32:11

VB.NET確定文件版

2010-01-21 13:34:56

VB.NET刪除文件夾

2009-11-10 13:27:30

VB.NET RND(

2024-11-04 06:10:00

.NETThreadPool線程池

2015-03-03 13:15:19

ASP.NET大文件下載實現(xiàn)思路

2010-02-05 08:32:32

ASP.NET MVC

2010-01-13 15:12:04

VB.NET字符串合并

2019-07-02 15:21:39

緩存NET單線程

2013-02-21 17:02:00

C語言

2024-05-20 13:06:18

2020-08-23 09:16:46

Linux文件合并和排序
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产成人精品久久二区二区 | 人人玩人人添人人澡欧美 | 日韩欧美成人一区二区三区 | 欧美1级 | 不卡一区 | 精品国产第一区二区三区 | 蜜月aⅴ国产精品 | 天天射夜夜操 | 成人性视频免费网站 | 99久久婷婷国产综合精品首页 | 国产成人精品网站 | 国产一区二区三区久久久久久久久 | 日韩日韩日韩日韩日韩日韩日韩 | 欧美精品一区二区三区蜜桃视频 | 国产精品久久久久久久久久 | 欧美黑人狂野猛交老妇 | 艹逼网| av一区二区在线观看 | 久久久福利 | 亚洲永久入口 | 在线一区 | 免费三级网站 | 成人免费视频观看视频 | 精产国产伦理一二三区 | 欧美一区日韩一区 | 欧美黄色网 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 中文字幕在线视频观看 | 国产日韩欧美在线 | 九一在线观看 | 7777在线| av在线播放国产 | 国产91在线精品 | 色婷婷综合网 | 午夜视频在线播放 | 国产精品美女久久久 | 四虎免费视频 | 欧美三区视频 | 美女久久视频 | 欧美色综合一区二区三区 | av官网在线|