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

實現.NET文件合并

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

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

這個文件。

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

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

主構思:

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

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

我是這樣做的:

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

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

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

Build方法用于生成包文件

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

好了,我們先來看看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為類型的,要輸出到包文件中的文件數量寫入

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

4. 再把每個文件名寫入

5. ***寫入每個文件的實體內容。

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

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

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

這里列出幾個重要方法:

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的構造函數

  1. internal PackFile(FileStream srcFile,BinaryReader br)  
  2.     {  
  3.         this._sourceFile = srcFile;  
  4.         _br = br;  
  5.         this._fileCount = _br.ReadInt32();//取文件數  
  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;//設置實體文件總起始位置  
  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; //設置某文件內容的起始位置  
  25.         return _br.ReadBytes((int)_fileLengthList[index]);  
  26.     } 

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

代碼下載:測試并合文件

我們來總結一下:

縱觀代碼可以發現,核心功能都在圍繞“偏移位置”與“長度”兩個概念,這在數據結構中很重要。同時,這也提醒了我們為什么在數據庫表字段中,作為主鍵的只能是“定長”類型,而不能是“變長”類型。

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

【編輯推薦】

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

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文件轉換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大文件下載實現思路

2010-02-05 08:32:32

ASP.NET MVC

2010-01-13 15:12:04

VB.NET字符串合并

2024-05-20 13:06:18

2019-07-02 15:21:39

緩存NET單線程

2013-02-21 17:02:00

C語言

2020-08-23 09:16:46

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

51CTO技術棧公眾號

主站蜘蛛池模板: 一区在线观看 | 成人在线视频免费观看 | 成人久久久 | 亚洲不卡一| 精品国产欧美一区二区三区不卡 | 国产精品久久久久久久午夜 | 99reav| 久久99国产精品久久99果冻传媒 | 成人在线视频网站 | 97在线播放| 日韩精品一区二区在线 | 拍真实国产伦偷精品 | 一区视频在线免费观看 | 久久91av | 国产在线激情视频 | 黄色大片免费看 | 在线视频a | 午夜精品一区二区三区在线观看 | 91精品一区二区三区久久久久 | 福利视频网站 | 久久久国产精品 | 国产伦精品一区二区三区高清 | av看片| 亚洲欧美一区二区三区国产精品 | 久久久网 | 亚洲免费一| 日本免费在线 | 精品国产一区二区三区免费 | 色综合久久天天综合网 | 天天操天天插天天干 | 91豆花视频 | 国产精品色 | 国产探花在线精品一区二区 | www.日本国产| av中文字幕在线 | 婷婷综合色 | 精品欧美一区免费观看α√ | 日韩区 | 一区二区三区免费在线观看 | 99精品国产在热久久 | 毛片高清 |