FTP操作/Passive/Active控制

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.IO;
  5 using System.Net;
  6 using System.Globalization;
  7 using System.IO.Compression;
  8 using ICSharpCode.SharpZipLib.Zip;
  9 using ICSharpCode.SharpZipLib.GZip;
 10 using ICSharpCode.SharpZipLib.Tar;
 11 
 12 namespace ClassProject.FTP
 13 {
 14     class FtpWeb
 15     {
 16         string ftpServerIP;
 17         string ftpRemotePath;
 18         string ftpUserID;
 19         string ftpPassword;
 20         string ftpURI;
 21         /// <summary>
 22         /// 连接FTP
 23         /// </summary>
 24         /// <param name="FtpServerIP">FTP连接地址</param>
 25         /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
 26         /// <param name="FtpUserID">用户名</param>
 27         /// <param name="FtpPassword">密码</param>
 28         public FtpWeb(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword)
 29         {
 30             ftpServerIP = FtpServerIP;
 31             ftpRemotePath = FtpRemotePath;
 32             ftpUserID = FtpUserID;
 33             ftpPassword = FtpPassword;
 34             ftpURI = "ftp://" + ftpServerIP + "/";
 35         }
 36         //测试用例--已成功
 37         //static void Main()
 38         //{ 
 39         //    FtpWeb fw = new FtpWeb(@"xxxxxx/FTPFile", @"C:\Users\Administrator\Desktop\dic\", "user", "password");
 40         //    string[] a = fw.NEWGetFileList(@"FTPFile");
 41         //    string path = @"C:\Users\Administrator\Desktop\新建文件夹";
 42         //    string X = "START:";
 43         //    for (int i = 0; i < a.Length; i++)
 44         //    {
 45         //            fw.Download(path, a[i].ToString(),'Active');
 46         //            fw.Delete(a[i].ToString());
 47         //            X += a[i] + "、";
 48         //    }
 49         //    Console.WriteLine("x");
 50         //    Console.ReadLine();
 51         //}
 52         //上传文件
 53         public string UploadFile(string[] filePaths)
 54         {
 55             StringBuilder sb = new StringBuilder();
 56             if (filePaths != null && filePaths.Length > 0)
 57             {
 58                 foreach (var file in filePaths)
 59                 {
 60                     sb.Append(Upload(file, "Active"));
 61                 }
 62             }
 63             return sb.ToString();
 64         }
 65         /// <summary>
 66         /// 上传文件
 67         /// </summary>
 68         /// <param name="filename"></param>
 69         public string  Upload(string filename,string type)
 70         {
 71             FileInfo fileInf = new FileInfo(filename);
 72             if (!fileInf.Exists)
 73             {
 74                 return filename + " 不存在!\n";
 75             }
 76             string uri = ftpURI + fileInf.Name;
 77             FtpWebRequest reqFTP;
 78             reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
 79             reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
 80             reqFTP.KeepAlive = false;
 81             reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
 82             reqFTP.UseBinary = true;
 83             if (type=="Active")
 84             {
 85                 reqFTP.UsePassive = false; //选择主动
 86             }
 87             else
 88             {
 89                 reqFTP.UsePassive = true; //选择被动模式  
 90             }
 91             
 92             //Entering Passive Mode
 93             reqFTP.ContentLength = fileInf.Length;
 94             int buffLength = 2048;
 95             byte[] buff = new byte[buffLength];
 96             int contentLen;
 97             FileStream fs = fileInf.OpenRead();
 98             try
 99             {
100                 Stream strm = reqFTP.GetRequestStream();
101                 contentLen = fs.Read(buff, 0, buffLength);
102                 while (contentLen != 0)
103                 {
104                     strm.Write(buff, 0, contentLen);
105                     contentLen = fs.Read(buff, 0, buffLength);
106                 }
107                 strm.Close();
108                 fs.Close();
109             }
110             catch (Exception ex)
111             {
112                 return "同步 " + filename + "时连接不上服务器!\n";
113                 //Insert_Standard_ErrorLog.Insert("FtpWeb", "Upload Error --> " + ex.Message);
114             }
115             return "";
116         }
117         /// <summary>
118         /// 下载
119         /// </summary>
120         /// <param name="filePath"></param>
121         /// <param name="fileName"></param>
122         public void Download(string filePath, string fileName, string type)
123         {
124             FtpWebRequest reqFTP;
125             try
126             {
127                 FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
128                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
129                 reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
130                 reqFTP.UseBinary = true;
131                 if (type == "Active")
132                 {
133                     reqFTP.UsePassive = false; //选择主动
134                 }
135                 else
136                 {
137                     reqFTP.UsePassive = true; //选择被动模式  
138                 }
139                 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
140                 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
141                 Stream ftpStream = response.GetResponseStream();
142                 long cl = response.ContentLength;
143                 int bufferSize = 2048;
144                 int readCount;
145                 byte[] buffer = new byte[bufferSize];
146                 readCount = ftpStream.Read(buffer, 0, bufferSize);
147                 while (readCount > 0)
148                 {
149                     outputStream.Write(buffer, 0, readCount);
150                     readCount = ftpStream.Read(buffer, 0, bufferSize);
151                 }
152                 ftpStream.Close();
153                 outputStream.Close();
154                 response.Close();
155             }
156             catch (Exception ex)
157             {
158                 // Insert_Standard_ErrorLog.Insert("FtpWeb", "Download Error --> " + ex.Message);
159             }
160         }
161         /// <summary>
162         /// 删除文件
163         /// </summary>
164         /// <param name="fileName"></param>
165         public void Delete(string fileName, string type)
166         {
167             try
168             {
169                 string uri = ftpURI + fileName;
170                 FtpWebRequest reqFTP;
171                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
172                 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
173                 reqFTP.KeepAlive = false;
174                 if (type == "Active")
175                 {
176                     reqFTP.UsePassive = false; //选择主动
177                 }
178                 else
179                 {
180                     reqFTP.UsePassive = true; //选择被动模式  
181                 }
182                 reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
183                 string result = String.Empty;
184                 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
185                 long size = response.ContentLength;
186                 Stream datastream = response.GetResponseStream();
187                 StreamReader sr = new StreamReader(datastream);
188                 result = sr.ReadToEnd();
189                 sr.Close();
190                 datastream.Close();
191                 response.Close();
192             }
193             catch (Exception ex)
194             {
195                 //Insert_Standard_ErrorLog.Insert("FtpWeb", "Delete Error --> " + ex.Message + " 文件名:" + fileName);
196             }
197         }
198 
199         /// <summary>
200         /// 删除文件
201         /// </summary>
202         /// <param name="srcPath">文件的路径</param>
203         public void DelectDir(string srcPath)
204         {
205             try
206             {
207                 DirectoryInfo dir = new DirectoryInfo(srcPath);
208                 FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();  //返回目录中所有文件和子目录
209                 foreach (FileSystemInfo i in fileinfo)
210                 {
211                     if (i is DirectoryInfo)            //判断是否文件夹
212                     {
213                         DirectoryInfo subdir = new DirectoryInfo(i.FullName);
214                         subdir.Delete(true);          //删除子目录和文件
215                     }
216                     else
217                     {
218                         File.Delete(i.FullName);      //删除指定文件
219                     }
220                 }
221             }
222             catch (Exception e)
223             {
224                 throw;
225             }
226         }
227 
228         /// <summary>
229         /// 获取当前目录下明细(包含文件和文件夹)
230         /// </summary>
231         /// <returns></returns>
232         public string[] GetFilesDetailList()
233         {
234             string[] downloadFiles;
235             try
236             {
237                 StringBuilder result = new StringBuilder();
238                 FtpWebRequest ftp;
239                 ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
240                 ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
241                 ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
242                 WebResponse response = ftp.GetResponse();
243                 StreamReader reader = new StreamReader(response.GetResponseStream());
244                 string line = reader.ReadLine();
245                 line = reader.ReadLine();
246                 line = reader.ReadLine();
247                 while (line != null)
248                 {
249                     result.Append(line);
250                     result.Append("\n");
251                     line = reader.ReadLine();
252                 }
253                 result.Remove(result.ToString().LastIndexOf("\n"), 1);
254                 reader.Close();
255                 response.Close();
256                 return result.ToString().Split('\n');
257             }
258             catch (Exception ex)
259             {
260                 downloadFiles = null;
261                 //Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFilesDetailList Error --> " + ex.Message);
262                 return downloadFiles;
263             }
264         }
265         /// <summary>
266         /// 获取当前目录下文件列表(仅文件)
267         /// </summary>
268         /// <returns></returns>
269         public string[] GetFileList(string mask, string type)
270         {
271             string[] downloadFiles;
272             StringBuilder result = new StringBuilder();
273             FtpWebRequest reqFTP;
274             try
275             {
276                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
277                 reqFTP.UseBinary = true;
278                 if (type == "Active")
279                 {
280                     reqFTP.UsePassive = false; //选择主动
281                 }
282                 else
283                 {
284                     reqFTP.UsePassive = true; //选择被动模式  
285                 }
286                 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
287                 reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
288                 WebResponse response = reqFTP.GetResponse();
289                 StreamReader reader = new StreamReader(response.GetResponseStream());
290                 string line = reader.ReadLine();
291                 while (line != null)
292                 {
293                     if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
294                     {
295                         string mask_ = mask.Substring(0, mask.IndexOf("*"));
296                         if (line.Substring(0, mask_.Length) == mask_)
297                         {
298                             result.Append(line);
299                             result.Append("\n");
300                         }
301                     }
302                     else
303                     {
304                         result.Append(line);
305                         result.Append("\n");
306                     }
307                     line = reader.ReadLine();
308                 }
309                 result.Remove(result.ToString().LastIndexOf('\n'), 1);
310                 reader.Close();
311                 response.Close();
312                 return result.ToString().Split('\n');
313             }
314             catch (Exception ex)
315             {
316                 downloadFiles = null;
317                 if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
318                 {
319                     //Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFileList Error --> " + ex.Message.ToString());
320                 }
321                 return downloadFiles;
322             }
323         }
324         /// <summary>
325         /// 获取当前目录下文件列表(仅文件)
326         /// </summary>
327         /// <returns></returns>
328         public string[] NEWGetFileList(string mask,string type)
329         {
330             string[] downloadFiles;
331             StringBuilder result = new StringBuilder();
332             FtpWebRequest reqFTP;
333             try
334             {
335                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
336                 reqFTP.UseBinary = true;
337                 if (type == "Active")
338                 {
339                     reqFTP.UsePassive = false; //选择主动
340                 }
341                 else
342                 {
343                     reqFTP.UsePassive = true; //选择被动模式  
344                 }
345                 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
346                 reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
347                 WebResponse response = reqFTP.GetResponse();
348                 StreamReader reader = new StreamReader(response.GetResponseStream());
349                 string line = reader.ReadLine();
350                 while (line != null)
351                 {
352                     if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
353                     {
354                         result.Append(line);
355                         result.Append("\n");
356                     }
357                     line = reader.ReadLine();
358                 }
359                 result.Remove(result.ToString().LastIndexOf('\n'), 1);
360                 reader.Close();
361                 response.Close();
362                 return result.ToString().Split('\n');
363             }
364             catch (Exception ex)
365             {
366                 downloadFiles = null;
367                 if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
368                 {
369                     //Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFileList Error --> " + ex.Message.ToString());
370                 }
371                 return downloadFiles;
372             }
373         }
374         /// <summary>
375         /// 获取当前目录下所有的文件夹列表(仅文件夹)
376         /// </summary>
377         /// <returns></returns>
378         public string[] GetDirectoryList()
379         {
380             string[] drectory = GetFilesDetailList();
381             string m = string.Empty;
382             foreach (string str in drectory)
383             {
384                 if (str.Trim().Substring(0, 1).ToUpper() == "D")
385                 {
386                     m += str.Substring(54).Trim() + "\n";
387                 }
388             }
389             char[] n = new char[] { '\n' };
390             return m.Split(n);
391         }
392         /// <summary>
393         /// 判断当前目录下指定的子目录是否存在
394         /// </summary>
395         /// <param name="RemoteDirectoryName">指定的目录名</param>
396         public bool DirectoryExist(string RemoteDirectoryName)
397         {
398             string[] dirList = GetDirectoryList();
399             foreach (string str in dirList)
400             {
401                 if (str.Trim() == RemoteDirectoryName.Trim())
402                 {
403                     return true;
404                 }
405             }
406             return false;
407         }
408         /// <summary>
409         /// 判断当前目录下指定的文件是否存在
410         /// </summary>
411         /// <param name="RemoteFileName">远程文件名</param>
412         public bool FileExist(string RemoteFileName)
413         {
414             string[] fileList = GetFileList("*.*", "Active");
415             foreach (string str in fileList)
416             {
417                 if (str.Trim() == RemoteFileName.Trim())
418                 {
419                     return true;
420                 }
421             }
422             return false;
423         }
424         /// <summary>
425         /// 创建文件夹
426         /// </summary>
427         /// <param name="dirName"></param>
428         public void MakeDir(string dirName)
429         {
430             FtpWebRequest reqFTP;
431             try
432             {
433                 // dirName = name of the directory to create.
434                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName));
435                 reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
436                 reqFTP.UseBinary = true;
437                 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
438                 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
439                 Stream ftpStream = response.GetResponseStream();
440                 ftpStream.Close();
441                 response.Close();
442             }
443             catch (Exception ex)
444             {
445                 //Insert_Standard_ErrorLog.Insert("FtpWeb", "MakeDir Error --> " + ex.Message);
446             }
447         }
448         /// <summary>
449         /// 创建文件
450         /// </summary>
451         /// <param name="dirName"></param>
452         /// <param name="interfaceLocation"></param> 
453         /// <param name="fileName"></param>
454         public string SavaProcess(string fileName, string dirName,string FilePath)
455         {
456             
457             //判断路径是否存在
458             if (!System.IO.Directory.Exists(FilePath))
459             {
460                 System.IO.Directory.CreateDirectory(FilePath);
461             }
462             //不存在就创建
463             FilePath = FilePath + "//" + fileName ;
464             //文件覆盖方式添加内容
465             System.IO.StreamWriter file = new System.IO.StreamWriter(FilePath, false);
466             //保存数据到文件
467             file.Write(dirName);
468             //关闭文件
469             file.Close();
470             //释放对象
471             file.Dispose();
472             return FilePath;
473         }
474         /// <summary>
475         /// 获取指定文件大小
476         /// </summary>
477         /// <param name="filename"></param>
478         /// <returns></returns>
479         public long GetFileSize(string filename)
480         {
481             FtpWebRequest reqFTP;
482             long fileSize = 0;
483             try
484             {
485                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));
486                 reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
487                 reqFTP.UseBinary = true;
488                 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
489                 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
490                 Stream ftpStream = response.GetResponseStream();
491                 fileSize = response.ContentLength;
492                 ftpStream.Close();
493                 response.Close();
494             }
495             catch (Exception ex)
496             {
497                 //Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFileSize Error --> " + ex.Message);
498             }
499             return fileSize;
500         }
501         /// <summary>
502         /// 改名
503         /// </summary>
504         /// <param name="currentFilename"></param>
505         /// <param name="newFilename"></param>
506         public void ReName(string currentFilename, string newFilename)
507         {
508             FtpWebRequest reqFTP;
509             try
510             {
511                 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));
512                 reqFTP.Method = WebRequestMethods.Ftp.Rename;
513                 reqFTP.RenameTo = newFilename;
514                 reqFTP.UseBinary = true;
515                 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
516                 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
517                 Stream ftpStream = response.GetResponseStream();
518                 ftpStream.Close();
519                 response.Close();
520             }
521             catch (Exception ex)
522             {
523                 //Insert_Standard_ErrorLog.Insert("FtpWeb", "ReName Error --> " + ex.Message);
524             }
525         }
526         /// <summary>
527         /// 移动文件
528         /// </summary>
529         /// <param name="currentFilename"></param>
530         /// <param name="newFilename"></param>
531         public void MovieFile(string currentFilename, string newDirectory)
532         {
533             ReName(currentFilename, newDirectory);
534         }
535         /// <summary>
536         /// 将数据写入文本文件中
537         /// </summary>
538         /// <param name="Filename"></param>
539         /// <param name="FileDate"></param>
540         public void WriteFile(string Filename, string FileDate)
541         {
542             //传入文本文件的名称,并将数据写入到文本文件中。
543             FileStream fs = new FileStream(Filename, FileMode.OpenOrCreate, FileAccess.ReadWrite);
544             StreamWriter sw = new StreamWriter(fs); // 创建写入流
545             sw.WriteLine(FileDate); // 写入数据
546             sw.Close(); //关闭文件
547             Console.WriteLine("OK");
548             Console.ReadKey();
549 
550         }
551 
552         /// <summary>  
553         /// zip压缩文件  
554         /// </summary>  
555         /// <param name="filename">filename生成的文件的名称,如:C\123\123.zip</param>  
556         /// <param name="directory">directory要压缩的文件夹路径</param>  
557         /// <returns></returns>  
558         public bool PackFiles(string filename, string directory)
559         {
560             try
561             {
562                 directory = directory.Replace("/", "\\");
563 
564                 if (!directory.EndsWith("\\"))
565                     directory += "\\";
566                 if (!Directory.Exists(directory))
567                 {
568                     Directory.CreateDirectory(directory);
569                 }
570                 if (File.Exists(filename))
571                 {
572                     File.Delete(filename);
573                 }
574 
575                 FastZip fz = new FastZip();
576                 fz.CreateEmptyDirectories = true;
577                 fz.CreateZip(filename, directory, true, "");
578 
579                 return true;
580             }
581             catch (Exception)
582             {
583                 return false;
584             }
585         }
586 
587         /// <summary>  
588         /// gzip压缩文件  
589         /// </summary>  
590         /// <param name="filename">需要进行压缩的文件</param>  
591         /// <param name="nowfilename">压缩后的文件的名字</param>  
592         /// <returns></returns>  
593         public void GPackFiles(string filename, string nowfilename)
594         {
595             using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
596             {
597                 //创建写入流
598                 using (FileStream save = new FileStream(nowfilename, FileMode.Create, FileAccess.Write))
599                 {
600                     //创建包含写入流的压缩流
601                     using (GZipStream gs = new GZipStream(save, CompressionMode.Compress))
602                     {
603                         //创建byte[]数组中转数据
604                         byte[] b = new byte[1024 * 1024];
605                         int count = 0;
606                         //循环将读取流中数据写入到byte[]数组中
607                         while ((count = fs.Read(b, 0, b.Length)) > 0)
608                         {
609                             //将byte[]数组中数据写入到压缩流
610                             gs.Write(b, 0, b.Length);
611                         }
612                     }
613                 }
614             }
615 
616         }
617 
618         /// <summary>  
619         /// gzip压缩文件  
620         /// </summary>  
621         /// <param name="filePath">需要进行压缩的文件</param>  
622         /// <param name="zipFilePath">压缩后的文件的名字</param>  
623         /// <returns></returns>  
624         public void gZipFile(string filePath, string zipFilePath)
625         {
626             Stream s = new GZipOutputStream(File.Create(zipFilePath));
627             FileStream fs = File.OpenRead(filePath);
628             int size;
629             byte[] buf = new byte[4096];
630             do
631             {
632                 size = fs.Read(buf, 0, buf.Length);
633                 s.Write(buf, 0, size);
634             } while (size > 0);
635             s.Close();
636             fs.Close();
637         }
638 
639         public  string Zip(string value)
640         {
641             //Transform string into byte[]
642             byte[] byteArray = new byte[value.Length];
643             int indexBA = 0;
644             foreach (char item in value.ToCharArray())
645             {
646                 byteArray[indexBA++] = (byte)item;
647             }
648             //Prepare for compress
649             System.IO.MemoryStream ms = new System.IO.MemoryStream();
650             System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms,System.IO.Compression.CompressionMode.Compress);
651             //Compress
652             sw.Write(byteArray, 0, byteArray.Length);
653             //Close, DO NOT FLUSH cause bytes will go missing...
654             sw.Close();
655             //Transform byte[] zip data to string
656             byteArray = ms.ToArray();
657             System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length);
658             foreach (byte item in byteArray)
659             {
660                 sB.Append((char)item);
661             }
662             ms.Close();
663             sw.Dispose();
664             ms.Dispose();
665             return sB.ToString();
666         }
667 
668         public string Compress(string param)
669         {
670             byte[] data = System.Text.Encoding.UTF8.GetBytes(param);
671             //byte[] data = Convert.FromBase64String(param);
672             MemoryStream ms = new MemoryStream();
673             Stream stream = new ICSharpCode.SharpZipLib.BZip2.BZip2OutputStream(ms);
674             try
675             {
676                 stream.Write(data, 0, data.Length);
677             }
678             finally
679             {
680                 stream.Close();
681                 ms.Close();
682             }
683             return Convert.ToBase64String(ms.ToArray());
684         }
685 
686         /// <summary>
687         /// 解压
688         /// </summary>
689         /// <param name="param"></param>
690         /// <returns></returns>
691         public  string Decompress(string param)
692         {
693             string commonString = "";
694             byte[] buffer = Convert.FromBase64String(param);
695             MemoryStream ms = new MemoryStream(buffer);
696             Stream sm = new ICSharpCode.SharpZipLib.BZip2.BZip2InputStream(ms);
697             //这里要指明要读入的格式,要不就有乱码
698             StreamReader reader = new StreamReader(sm, System.Text.Encoding.UTF8);
699             try
700             {
701                 commonString = reader.ReadToEnd();
702             }
703             finally
704             {
705                 sm.Close();
706                 ms.Close();
707             }
708             return commonString;
709         }
710 
711         /// <summary>  
712         /// tar压缩文件  
713         /// </summary>  
714         /// <param name="filename">filename生成的文件的名称,如:C\123\123.zip</param>  
715         /// <param name="directory">directory要压缩的文件夹路径</param>  
716         /// <returns></returns>  
717         public void TarCreateFromStream(string filename , string directory)
718         {
719 
720             // 创建输出流。不必是磁盘,可以是内存流等。
721             string tarOutFn = filename;
722             Stream outStream = File.Create(tarOutFn);
723             TarOutputStream tarOutputStream = new TarOutputStream(outStream);
724 
725             CreateTarArchive(tarOutputStream, directory);
726 
727             // 关闭归档文件也关闭底层流。
728             tarOutputStream.Close();
729         }
730 
731         private  void CreateTarArchive(TarOutputStream tarOutputStream, string sourceDirectory)
732         {
733             // 可选地,为目录本身写一个条目。
734             // TarEntry tarEntry = TarEntry.CreateEntryFromFile(sourceDirectory);
735             // tarOutputStream.PutNextEntry(tarEntry);
736             // 将每个文件写入tar。
737             string[] filenames = Directory.GetFiles(sourceDirectory);
738 
739             foreach (string filename in filenames)
740             {
741                 using (Stream inputStream = File.OpenRead(filename))
742                 {
743                     int idxStart = filename.LastIndexOf('\\') + 1;
744                     string tarName = filename.Substring(idxStart, filename.Length - idxStart);
745                     long fileSize = inputStream.Length;
746                     TarEntry entry = TarEntry.CreateTarEntry(tarName);
747 
748                     // 必须设置大小,否则当输出超过时,TAROutPutsFipe将失败。
749                     entry.Size = fileSize;
750 
751                     // 在写入数据之前,将条目添加到TAR流中。
752                     tarOutputStream.PutNextEntry(entry);
753 
754                     // 这是从TracSovi.Read EngyCype复制的
755                     byte[] localBuffer = new byte[32 * 1024];
756                     while (true)
757                     {
758                         int numRead = inputStream.Read(localBuffer, 0, localBuffer.Length);
759                         if (numRead <= 0)
760                         {
761                             break;
762                         }
763                         tarOutputStream.Write(localBuffer, 0, numRead);
764                     }
765                 }
766                 tarOutputStream.CloseEntry();
767             }
768             // 递归。如果不需要就删除。
769             //string[] directories = Directory.GetDirectories(sourceDirectory);
770             //foreach (string directory in directories)
771             //{
772             // CreateTarArchive(tarOutputStream, directory);
773             //}
774         }
775 
776     }
777 }

 

上一篇:FTP主动模式(Port)和被动模式(Passive)的区别


下一篇:滑动时候警告:Unable to preventDefault inside passive event listener