自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實現(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#單元測試的運行淺析
責(zé)任編輯:彭凡 來源: 博客園
相關(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

2011-04-06 09:30:52

.NET

2009-07-24 10:23:07

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

2010-01-07 13:40:50

VB.NET讀取XML

2024-06-20 08:09:24

2010-01-13 14:32:11

VB.NET確定文件版

2009-11-03 13:16:58

VB.NET讀取文件

2009-11-10 13:27:30

VB.NET RND(

2010-01-21 13:34:56

VB.NET刪除文件夾

2010-01-13 15:12:04

VB.NET字符串合并

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

2024-05-20 13:06:18

2023-11-17 08:23:10

Android開發(fā)

2023-04-17 16:17:19

LinuxPDF

2020-08-23 09:16:46

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

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