码迷,mamicode.com
首页 > 其他好文 > 详细

如何直接处理FTP服务器上的压缩文件?

时间:2015-07-31 07:51:17      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

我最近要写一个供有相关权限的管理人员查询大额资金明细的程序,界面如下: 
技术分享 
技术分享 
所需的数据文件是放在报表服务器上,每天一个压缩文件,该压缩文件中除了所需的储蓄流水账文件外,还有很多其他的文件。如果先把该压缩文件从报表服务器下载到应用服务器上,再进行解压缩处理的话,一是多下载了该压缩文件中我们不需要的其他文件,二是还必须在应用服务器上建立以SessionID等方法标识的临时文件,以免其他用户也在进行查询时文件名冲突,三是使用完毕后还必须删除该临时文件。
我的处理方法是如下:
using (ZipInputStream zs = Zip.GetZipInputStream((new FtpClient(Pub.Ftp1Uri, Pub.Ftp1User, Pub.Ftp1Pswd)).
        GetDownloadStream(Path.Combine(Pub.Ftp1EPath, zipFileName)), binFileName, out size))
      {
        if (size % Pub.P_R2 != 0) throw new ApplicationException("文件长度错: " + binFileName);
        byte [] bs = new byte[Pub.P_R2];
        long recs = size / Pub.P_R2;
        for (long rec = 0; rec < recs; rec++)
        {
          Zip.ReadStream(zs, bs);
          ...
      }
首先,用 FtpClient.GetDownloadStream() 方法得到一个对应于FTP服务器上文件的Stream,然后把这个Stream传给Zip.GetZipInputStream()方法,得到一个ZipInputStream,然后使用Zip.ReadStream()方法一行一行读取储蓄流水账文件到byte[]中去,这样就取得了我们所需的数据,就象储蓄流水账文件就存放在本地硬盘上一样,避免了下载文件和解压文件。具体代码如下:

 1技术分享using System; 
 2技术分享using System.IO; 
 3技术分享using System.Net; 
 4技术分享 
 5技术分享namespace Skyiv.Util 
 6技术分享
 7技术分享  sealed class FtpClient 
 8技术分享  
 9技术分享    Uri uri; 
10技术分享    string userName; 
11技术分享    string password; 
12技术分享     
13技术分享    public FtpClient(string uri, string userName, string password) 
14技术分享    
15技术分享      this.uri = new Uri(uri); 
16技术分享      this.userName = userName; 
17技术分享      this.password = password; 
18技术分享    }
 
19技术分享     
20技术分享    public Stream GetDownloadStream(string sourceFile) 
21技术分享    
22技术分享      Uri downloadUri = new Uri(uri, sourceFile); 
23技术分享      if (downloadUri.Scheme != Uri.UriSchemeFtp) throw new ArgumentException("URI is not an FTP site"); 
24技术分享      FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(downloadUri); 
25技术分享      ftpRequest.Credentials = new NetworkCredential(userName, password); 
26技术分享      ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile; 
27技术分享      return ((FtpWebResponse)ftpRequest.GetResponse()).GetResponseStream(); 
28技术分享    }
 
29技术分享     
30技术分享    /*public */void Download(string sourceFile, string destinationFile) 
31技术分享    
32技术分享      using (Stream reader = GetDownloadStream(sourceFile)) 
33技术分享      
34技术分享        using (BinaryWriter bw = new BinaryWriter(new FileStream(destinationFile, FileMode.Create))) 
35技术分享        
36技术分享          for (;;) 
37技术分享          
38技术分享            int c = reader.ReadByte(); 
39技术分享            if (c == -1break
40技术分享            bw.Write((byte)c); 
41技术分享          }
 
42技术分享        }
 
43技术分享      }
 
44技术分享    }
 
45技术分享  }
 
46技术分享}
 
47技术分享
 1技术分享using System; 
 2技术分享using System.IO; 
 3技术分享using ICSharpCode.SharpZipLib.Zip; 
 4技术分享 
 5技术分享namespace Skyiv.Util 
 6技术分享
 7技术分享  static class Zip 
 8技术分享  
 9技术分享    public static void ReadStream(Stream inStream, byte [] bs) 
10技术分享    
11技术分享      int offset = 0
12技术分享      int count = bs.Length; 
13技术分享      do  
14技术分享      
15技术分享        int size = inStream.Read(bs, offset, count); 
16技术分享        if (size <= 0break
17技术分享        offset += size; 
18技术分享        count -= size; 
19技术分享      }
 while (count > 0); 
20技术分享      if (count != 0throw new ApplicationException("Zip.ReadStream(): 读输入流错"); 
21技术分享    }
 
22技术分享     
23技术分享    public static ZipInputStream GetZipInputStream(string zipFileName, string fileName, out long fileLength) 
24技术分享    
25技术分享      return GetZipInputStream(File.OpenRead(zipFileName), fileName, out fileLength); 
26技术分享    }
 
27技术分享     
28技术分享    public static ZipInputStream GetZipInputStream(Stream zipStream, string fileName, out long fileLength) 
29技术分享    
30技术分享      ZipInputStream zs = new ZipInputStream(zipStream); 
31技术分享      ZipEntry theEntry; 
32技术分享      while ((theEntry = zs.GetNextEntry()) != null)  
33技术分享      
34技术分享        if (Path.GetFileName(theEntry.Name) != fileName) continue
35技术分享        fileLength = theEntry.Size; 
36技术分享        return zs; 
37技术分享      }
 
38技术分享      fileLength = -1
39技术分享      return null
40技术分享    }
 
41技术分享 
42技术分享    /*public */static void UnzipFile(string zipFile, string baseStr, params string [] fileList) 
43技术分享    
44技术分享      UnzipFile(File.OpenRead(zipFile), baseStr, fileList); 
45技术分享    }
 
46技术分享     
47技术分享    /*public */static void UnzipFile(Stream zipStream, string baseStr, params string [] fileList) 
48技术分享    
49技术分享      using (ZipInputStream zs = new ZipInputStream(zipStream)) 
50技术分享      
51技术分享        ZipEntry theEntry; 
52技术分享        byte[] data = new byte[4096]; 
53技术分享        while ((theEntry = zs.GetNextEntry()) != null
54技术分享          if (Array.IndexOf(fileList, Path.GetFileName(theEntry.Name)) < 0continue
55技术分享          using (FileStream sw = new FileStream(baseStr+Path.GetFileName(theEntry.Name), FileMode.Create)) 
56技术分享          
57技术分享            while (true
58技术分享              int size = zs.Read(data, 0, data.Length); 
59技术分享              if (size <= 0break
60技术分享              sw.Write(data, 0, size); 
61技术分享            }
 
62技术分享          }
 
63技术分享        }
 
64技术分享      }
 
65技术分享    }
 
66技术分享  }
 
67技术分享}
 
68技术分享
 1技术分享    void MakeData(DateTime workDate, short brno, short currtype, decimal startAmt) 
 2技术分享    
 3技术分享      Pub.SetNOVA(workDate); 
 4技术分享      string zipFileName = string.Format("e-{0:yyyyMMdd}-{1:D4}-0000{2}.zip", workDate, Pub.Zone, Pub.IsNOVAv12 ? "-2" : ""); 
 5技术分享      string binFileName = string.Format("e-{0:yyyyMMdd}-pfsjnl.bin", workDate); 
 6技术分享      long size; 
 7技术分享      DataTable dt = MakeDataTable(); 
 8技术分享      using (ZipInputStream zs = Zip.GetZipInputStream((new FtpClient(Pub.Ftp1Uri, Pub.Ftp1User, Pub.Ftp1Pswd)). 
 9技术分享        GetDownloadStream(Path.Combine(Pub.Ftp1EPath, zipFileName)), binFileName, out size)) 
10技术分享      
11技术分享        if (size % Pub.P_R2 != 0throw new ApplicationException("文件长度错: " + binFileName); 
12技术分享        byte [] bs = new byte[Pub.P_R2]; 
13技术分享        long recs = size / Pub.P_R2; 
14技术分享        for (long rec = 0; rec < recs; rec++
15技术分享        
16技术分享          Zip.ReadStream(zs, bs); 
17技术分享          if (Etc.Encode.GetString(bs,Pub.P_R2_RevTran,Pub.L_Revtran) != "0"continue// 反交易标志 
18技术分享          for (int i = 0; i < 2; i++
19技术分享          
20技术分享            bool isDebit = (i == 0); 
21技术分享            if (int.Parse(Etc.Encode.GetString(bs,(isDebit?Pub.P_R2_Drcurr:Pub.P_R2_Crcurr),Pub.L_Curr)) != currtype) continue
22技术分享            decimal amt0 = decimal.Parse(Etc.Encode.GetString(bs,(isDebit?Pub.P_R2_Amount1:Pub.P_R2_Amount2),Pub.L_Bal)) / 100
23技术分享            if (Math.Abs(amt0) < startAmt) continue
24技术分享            string account = Etc.Encode.GetString(bs,(isDebit?Pub.P_R2_Draccno:Pub.P_R2_Craccno),Pub.L_Accno); 
25技术分享            if (!DbBranch.IsMyAccount(account, brno)) continue
26技术分享            string customer = Etc.Encode.GetString(bs,Pub.P_R2_Notes1,Pub.L_Notes1).Trim(@ ); 
27技术分享            short nodeno = short.Parse(Etc.Encode.GetString(bs,Pub.P_R2_Brno,Pub.L_Brno)); 
28技术分享            int code = int.Parse(Etc.Encode.GetString(bs,Pub.P_R2_Trxcode,Pub.L_Trxcode)); 
29技术分享            DataRow dr = dt.NewRow(); 
30技术分享            dr["No"= nodeno; 
31技术分享            dr["Name"= DbBranch.GetBrief(DbBranch.IsAllNode(brno), nodeno); 
32技术分享            dr["Teller"= int.Parse(Etc.Encode.GetString(bs,Pub.P_R2_Teller,Pub.L_Teller)); 
33技术分享            dr["Account"= IcbcEtc.FormatAccount19(account); 
34技术分享            dr["User"= customer; 
35技术分享            dr["Flag"= (isDebit ? "" : ""); 
36技术分享            dr["Amt"= amt0; 
37技术分享            dr["Memo"= Etc.Encode.GetString(bs,Pub.P_R2_Cashnote,Pub.L_Cashnote); 
38技术分享            dr["Code"= code; 
39技术分享            dr["TrName"= DbTrxCode.GetNewName(code); 
40技术分享            dt.Rows.Add(dr); 
41技术分享          }
 
42技术分享        }
 
43技术分享      }
 
44技术分享      DataView dv = dt.DefaultView; 
45技术分享      dv.Sort = "Flag DESC, Amt DESC"
46技术分享      dgMain.DataSource = dv; 
47技术分享      dgMain.DataBind(); 
48技术分享    }
 
49技术分享

版权声明:本文为博主http://www.zuiniusn.com 原创文章,未经博主允许不得转载。

如何直接处理FTP服务器上的压缩文件?

标签:

原文地址:http://blog.csdn.net/u013141940/article/details/47163965

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!