程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 壓縮和解壓文件(SharpZipLib),

C# 壓縮和解壓文件(SharpZipLib),

編輯:C#入門知識

C# 壓縮和解壓文件(SharpZipLib),


先從網上下載ICSharpCode.SharpZipLib.dll類庫

將文件或文件夾壓縮為zip,函數如下

 1         /// <summary>
 2         /// 壓縮文件
 3         /// </summary>
 4         /// <param name="fileName">壓縮文件路徑</param>
 5         /// <param name="zipName">壓縮的文件名稱</param>
 6         /// <param name="error">返回的錯誤信息</param>
 7         /// <returns></returns>
 8         public bool FileToZip(string fileName, string zipName, out string error)
 9         {
10             error = string.Empty;
11             try
12             {
13                 ZipOutputStream s = new ZipOutputStream(File.Create(zipName));
14                 s.SetLevel(6); // 0 - store only to 9 - means best compression
15                 zip(fileName, s);
16                 s.Finish();
17                 s.Close();
18                 return true;
19             }
20             catch (Exception ex)
21             {
22                 error = ex.Message;
23                 return false;
24             }
25         }
26 
27 
28         private void zip(string fileName, ZipOutputStream s)
29         {
30             if (fileName[fileName.Length - 1] != Path.DirectorySeparatorChar)
31                 fileName += Path.DirectorySeparatorChar;
32             Crc32 crc = new Crc32();
33             string[] filenames = Directory.GetFileSystemEntries(fileName);
34             foreach (string file in filenames)
35             {
36                 if (Directory.Exists(file))
37                 {
38                     zip(file, s);
39                 }
40                 else // 否則直接壓縮文件
41                 {
42                     //打開壓縮文件
43                     FileStream fs = File.OpenRead(file);
44 
45                     byte[] buffer = new byte[fs.Length];
46                     fs.Read(buffer, 0, buffer.Length);
47                     string tempfile = Path.GetFileName(file);
48                     ZipEntry entry = new ZipEntry(tempfile);
49 
50                     entry.DateTime = DateTime.Now;
51                     entry.Size = fs.Length;
52                     fs.Close();
53                     crc.Reset();
54                     crc.Update(buffer);
55                     entry.Crc = crc.Value;
56                     s.PutNextEntry(entry);
57 
58                     s.Write(buffer, 0, buffer.Length);
59                 }
60             }
61         }

 

將zip解壓為文件或文件夾,函數代碼如下

 1         /// <summary>
 2         /// 解壓文件
 3         /// </summary>
 4         /// <param name="zipName">解壓文件路徑</param>
 5         /// <param name="fileDirName">解壓到文件夾的名稱</param>
 6         /// <param name="error">返回的錯誤信息</param>
 7         /// <returns></returns>
 8         public bool ZipToFile(string zipName, string fileDirName, out string error)
 9         {
10             try
11             {
12                 error = string.Empty;
13                 //讀取壓縮文件(zip文件),准備解壓縮
14                 ZipInputStream s = new ZipInputStream(File.Open(zipName.Trim(), FileMode.Open, FileAccess.Read));
15                 ZipEntry theEntry;
16 
17                 string rootDir = " ";
18                 while ((theEntry = s.GetNextEntry()) != null)
19                 {
20                     string path = fileDirName;
21                     //獲取該文件在zip中目錄
22                     rootDir = Path.GetDirectoryName(theEntry.Name);
23                     //獲取文件名稱
24                     string fileName = Path.GetFileName(theEntry.Name);
25                     if (string.IsNullOrEmpty(fileName))
26                         continue;
27                     //判斷是否為頂層文件,是,將文件直接放在fileDirName下,否,創建目錄
28                     if (string.IsNullOrEmpty(rootDir))
29                     {
30                         if (!Directory.Exists(path))
31                             Directory.CreateDirectory(path);
32                     }
33                     else
34                     {
35                         path += "\\" + rootDir;
36                         if (!Directory.Exists(path))
37                             Directory.CreateDirectory(path);
38                     }
39 
40                     //將文件流寫入對應目錄下的文件中
41                     if (fileName != String.Empty)
42                     {
43                         FileStream streamWriter = File.Create(path + "\\" + fileName);
44 
45                         int size = 2048;
46                         byte[] data = new byte[2048];
47                         while (true)
48                         {
49                             if (theEntry.Size == 0)
50                                 break;
51 
52                             size = s.Read(data, 0, data.Length);
53                             if (size > 0)
54                             {
55                                 streamWriter.Write(data, 0, size);
56                             }
57                             else
58                             {
59                                 break;
60                             }
61                         }
62                         streamWriter.Close();
63                     }
64                 }
65                 s.Close();
66                 return true;
67             }
68             catch (Exception ex)
69             {
70                 error = ex.Message;
71                 return false;
72             }
73         }

調用示例

1 string error; 2 if (FileToZip(@"E:\文檔", "文檔.zip", out error)) 3 MessageBox.Show("Succee"); 4 else 5 MessageBox.Show(error); 壓縮示例 1 string error; 2 if (ZipToFile(@"E:\文檔.zip", "文檔", out error)) 3 MessageBox.Show("Succee"); 4 else 5 MessageBox.Show(error); 解壓示例

 


C語言中->是什?

->是一個整體,它是用於指向結構體、C++中的class等含有子數據的指針用來取子數據。換種說法,如果我們在C語言中定義了一個結構體,然後申明一個指針指向這個結構體,那麼我們要用指針取出結構體中的數據,就要用到“->”.
舉個例子:
struct Data
{
int a,b,c;
}; /*定義結構體*/
struct Data * p;/*定義結構體指針*/
struct Data A = {1,2,3};/*聲明變量A*/
int x;/*聲明一個變量x*/
p = &A ; /*讓p指向A*/
x = p->a;/*這句話的意思就是取出p所指向的結構體中包含的數據項a賦值給x*/
/*由於此時p指向A,因而 p->a == A.a,也就是1*/

對於一開始的問題 p = p->next;這應該出現在C語言的鏈表,這裡的next應該是一個與p同類型的結構體指針,其定義格式應該是:
struct Data
{
int a;
struct Data * next;
};/*定義結構體*/
…………
main()
{
struct Data * p;/*聲明指針變量p*/
……
p = p->next;/*將next中的值賦給p*/
}
鏈表指針是C語言的一個難點,但也是重點,學懂了非常有用。要仔細講就必須先講變量、指針。
什麼是變量?所謂變量,不要淺顯的認為會變得量就是變量。套用我們院長的問話:“教室變不變?”變,因為每天有不同的人在裡面上課,但又不變,因為教室始終在那,沒有變大或變小。這就是變量:有一個不變的地址和一塊可變的存儲空間。正常情況下,我們只看到變量這個房間裡面的東西,也就是其內容,但不會關注變量的地址,但是C語言的指針,就是這個房間的地址。我們聲明變量就相當於蓋了間房子存放東西,我們可以直接觀看房子裡的東西,而聲明指針,就是相當於獲得了一個定位器,當用指針指向某個變量時,就是用指針給變量定位,以後我們就可以用指針找到他所“跟蹤”的變量並可以獲得裡面的內容。
那結構體呢?結構體就相當於是有好幾個房子組成的別墅,幾個房子綁定在一起使用。假設現在有很多這種別墅分布在一個大迷宮裡,每間別墅裡都有一間房子。裡面放了另一個別墅的位置信息,現在你手拿定位器找到了第一棟別墅,從裡面得到了你想要的東西(鏈表的數據部分),然後把下一棟別墅的位置計入你的定位器(p = p->next),再走向下一棟別墅……如此走下去,知道走到某地下一棟別墅信息沒有了(p->next == NULL),你的旅行結束。這就是鏈表一次遍歷的過程。現在你能明白 p=p->next的含義了吧!
寫了這麼多。希望你能明白。
如果想學好c和C++,鏈表和指針必須熟練掌握!
 

C語言中->是什?

->是一個整體,它是用於指向結構體、C++中的class等含有子數據的指針用來取子數據。換種說法,如果我們在C語言中定義了一個結構體,然後申明一個指針指向這個結構體,那麼我們要用指針取出結構體中的數據,就要用到“->”.
舉個例子:
struct Data
{
int a,b,c;
}; /*定義結構體*/
struct Data * p;/*定義結構體指針*/
struct Data A = {1,2,3};/*聲明變量A*/
int x;/*聲明一個變量x*/
p = &A ; /*讓p指向A*/
x = p->a;/*這句話的意思就是取出p所指向的結構體中包含的數據項a賦值給x*/
/*由於此時p指向A,因而 p->a == A.a,也就是1*/

對於一開始的問題 p = p->next;這應該出現在C語言的鏈表,這裡的next應該是一個與p同類型的結構體指針,其定義格式應該是:
struct Data
{
int a;
struct Data * next;
};/*定義結構體*/
…………
main()
{
struct Data * p;/*聲明指針變量p*/
……
p = p->next;/*將next中的值賦給p*/
}
鏈表指針是C語言的一個難點,但也是重點,學懂了非常有用。要仔細講就必須先講變量、指針。
什麼是變量?所謂變量,不要淺顯的認為會變得量就是變量。套用我們院長的問話:“教室變不變?”變,因為每天有不同的人在裡面上課,但又不變,因為教室始終在那,沒有變大或變小。這就是變量:有一個不變的地址和一塊可變的存儲空間。正常情況下,我們只看到變量這個房間裡面的東西,也就是其內容,但不會關注變量的地址,但是C語言的指針,就是這個房間的地址。我們聲明變量就相當於蓋了間房子存放東西,我們可以直接觀看房子裡的東西,而聲明指針,就是相當於獲得了一個定位器,當用指針指向某個變量時,就是用指針給變量定位,以後我們就可以用指針找到他所“跟蹤”的變量並可以獲得裡面的內容。
那結構體呢?結構體就相當於是有好幾個房子組成的別墅,幾個房子綁定在一起使用。假設現在有很多這種別墅分布在一個大迷宮裡,每間別墅裡都有一間房子。裡面放了另一個別墅的位置信息,現在你手拿定位器找到了第一棟別墅,從裡面得到了你想要的東西(鏈表的數據部分),然後把下一棟別墅的位置計入你的定位器(p = p->next),再走向下一棟別墅……如此走下去,知道走到某地下一棟別墅信息沒有了(p->next == NULL),你的旅行結束。這就是鏈表一次遍歷的過程。現在你能明白 p=p->next的含義了吧!
寫了這麼多。希望你能明白。
如果想學好c和C++,鏈表和指針必須熟練掌握!
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved