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

我最近要写一个供有相关权限的管理人员查询大额资金明细的程序,界面如下:

所需的数据文件是放在报表服务器上,每天一个压缩文件,该压缩文件中除了所需的储蓄流水账文件外,还有很多其他的文件。如果先把该压缩文件从报表服务器下载到应用服务器上,再进行解压缩处理的话,一是多下载了该压缩文件中我们不需要的其他文件,二是还必须在应用服务器上建立以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[]中去,这样就取得了我们所需的数据,就象储蓄流水账文件就存放在本地硬盘上一样,避免了下载文件和解压文件。具体代码如下:

1using System;

2using System.IO;

3using System.Net;

4

5namespace 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 == -1) break;

40            bw.Write((byte)c);

41          }

42        }

43      }

44    }

45  }

46}

47

1using System;

2using System.IO;

3using ICSharpCode.SharpZipLib.Zip;

4

5namespace 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 <= 0) break;

17        offset += size;

18        count -= size;

19      } while (count > 0);

20      if (count != 0) throw 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)) < 0) continue;

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 <= 0) break;

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 != 0) throw 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 原创文章,未经博主允许不得转载。

时间: 2024-10-24 02:18:07

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

使用批处理文件在FTP服务器 上传下载文件

1.从ftp服务器根目录文件夹下的文件到指定的文件夹下 格式:ftp -s:[配置文件] [ftp地址] 如:ftp -s:c:\vc\ftpconfig.txt   192.168.1.1 建立一个批处理文件:命名为 test.bat(名称可以随便,为了方便操作,直接命名为1.bat)  然后将上面的内容拷贝进去 ftpconfig.txt的文件内容是: testuser test get test.exe    C:\ftptest\testdownload.exe bye 解释: 前两条命

Java通过FTP服务器上传下载文件的解决方案

对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案.本文使用Apache Jakarta Commons Net(commons-net-3.3.jar)基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作. 关于FileZilla Server服务器的详细搭建配置过程,详情请见FileZilla Server安装配置教程.之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲测上传2G的文件到F

使用SAXReader读取ftp服务器上的xml文件(原创)

根据项目需求,需要监测ftp服务器上的文件变化情况,并将新添加的文件读入项目系统(不需要下载). spring配置定时任务就不多说了,需要注意的一点就是,现在的项目很多都是通过maven构建的,分好多子项目,通过pom互相依赖,定时任务的配置文件需要放到tomcat等容器发布的工程下,而不要放到任务所在的子项目里面,bean的class属性是可以通过项目依赖读取到其他子项目里面的class的,而且任务类需要有构造方法,涉及到spring架构的bean的知识,说的有点多了... =========

Spring中利用组件实现从FTP服务器上传/下载文件

FtpUtil.java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.ne

java实现读取ftp服务器上的csv文件

定义ftp操作接口 import java.io.InputStream; import java.util.List; import org.apache.commons.net.ftp.FTPClient; /** * FTP服务器操作*/ public interface iFtpServU { public FTPClient ftp(String ip, String user, String password); public List<String[]> csv(InputStr

从ftp服务器上下载文件

从ftp服务器上下载文件 FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Protocol(文件传输协议).顾名思义,就是专门用来传输文件的协议.简单地说,支持FTP协议的服务器就是FTP服务器. 那么怎样从ftp服务器上下载文件呢?具体操作如下: ftpget -u zyx -p 123456  192.168.1.156  /hello ftpget :指令

向云服务器上传下载文件方法汇总(转)

转载于:https://yq.aliyun.com/articles/64700 摘要: 一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌面的时候,点"选项>>" 2."本地资源"-->详细信息. 3."磁盘驱动器"前面打钩. 一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌

向linux服务器上传下载文件方式收集

向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 . 命令格式: scp [参数] <源地址(用户名@IP地址或主机名)>:<文件路径> <目的地址(用户名 @IP 地址或主机名)>:<文件路径> 举例: scp /home/work/source.

windows、linux通过ftp从ftp服务器上传和下载

最近需要用到文件的上传和下载,查看我们使用的系统,发现有一个进程为t_ftpd,怀疑其为一个ftp的守护进程,于是想要用ftp的方式实现. 在windows上使用bat脚本的方式实现: 首先写一个bat脚本: download.bat @echo off ftp -s:E:\Sylixos\SylixOS_Qt\build-TCWareWigget-Desktop_Qt_5_7_1_MinGW_32bit-Debug\debug\ftp\ftp.txt 这样就会调用ftp.txt文件 ftp.t