文件传输(一)---压缩文件

异构系统之间的交互有很多种方式,AX的AIF框架通过文件,Web Services和MSMQ等提供了实现各种交互方式的可能性,井底之蛙的缘故,总觉得这些方式有些隔靴搔痒的感觉,做为AX来说,它不可能针对其他的非主流异构系统提供相应的接口,它只能定一个接口标准,让其他的异构系统去按照它的格式准备数据,为了通用,它尽量采用XML等标准的格式文件,其它异构系统必须按照它的格式去准备接口数据,写这个接口这通常是一件痛苦的事情,比起让异构系统的人员了解AX的每个字段的含义,我宁可去了解其他系统的实现,在AX里做其他系统的接口,并且很多异构系统并没有那么理想可以支持AX提供的接口,并且在当前的网络状态下,效率也是问题,所以感觉AIF是个好东东,但有些理想,但愿有一天会遇到一个项目让我有机会玩玩这东东吧。

貌似跑题了。。。
记得听一个朋友说起,在上世纪90年代初期,那个时候他们各个分部之间传数据都是靠Mail的,现在应该也还是有很多公司在采用这种方式,虽然不是很可靠和高效,但大多数情况下足够用了,最近做一个项目需要在分公司和总部之间传递数据,网络不是很稳定,最基本的要求是文件要能可靠地传递,在网络断掉的情况下可以断点续传,提到可靠传输文件,我首先想到的是MQ,看过一些介绍MQ的文章,MQ的是异步传输文件的不错的方案,但IBM的MQ要Money。微软的MSMQ,花了一两天的时候在网上找相关的文档,想开发一个简单的测试的东西,在局域网上感觉还蛮不错的,没出什么问题,在测试Internet传递文件时,出了一些莫名其妙的问题,用Google把网络搜了个底朝天都没找到只言片语,MSMQ的资料实在是太少了,即使这个问题解决了,以后遇到其他的问题也不知道怎么解决了,做AX这个没多少人玩的东西已经够痛苦了,再招惹个更少人玩的MSMQ就不用活了,呵呵。于是放弃MQ,改用资料相对较多的FTP,微软的IIS组件包含FTP,免费的,别人的名字叫文件传输协议,所以就用它吧。
为了提高传输数据的效率和可靠性,需要:
1.压缩文件
2.断点续传
本文先说一下压缩文件的实现。
关于压缩文件,有很多实现的方式,参考了网上的很多资料,有通过调过在.NET中调用Winrar等压缩工具的应用程序的方式,网上也有人写了现成的类,有一篇blog对把文件压缩成zip文件的方式做了汇总,我在这里就不赘述了,文章的链接如下:
http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx
我最后采用了上文中提到的.NET Framework3.0新增的System.IO.Packaging 这个类库里的相关类,上文中关于压缩部分的代码已经有了,这里也转贴一下,只做了少许改动:

ContractedBlock.gif ExpandedBlockStart.gif Code
private void prepareFileToBeUploaded()
        {
            
if (!localUploadAddress.EndsWith(@"\"))
                localUploadAddress 
+= @"\";


            System.IO.DirectoryInfo dirInfo 
= new DirectoryInfo(localUploadAddress);
            System.IO.FileInfo[] fileInfos 
= dirInfo.GetFiles();

            
//Get Files to be uploaded
            foreach (FileInfo fileInfo in fileInfos)
            {
                
//Zip File
                this.zipFiles(localUploadAddress + zipFileName + ".zip", fileInfo.FullName);
                
//Backup File
                fileInfo.CopyTo(localUploadBackupAddress + fileInfo.Name);
                
//Delete File
                fileInfo.Delete();

            }
        }

private void zipFiles(string zipFileName,string fileToAdd)
        {
            
using (Package zip = System.IO.Packaging.Package.Open(zipFileName, FileMode.OpenOrCreate))
            {
                
string destFilename = ".\\" + Path.GetFileName(fileToAdd);
                Uri uri 
= PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
                
if (zip.PartExists(uri))
                {
                    zip.DeletePart(uri);
                }
                PackagePart part 
= zip.CreatePart(uri, "", CompressionOption.Normal);
                
using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
                {
                    
using (Stream dest = part.GetStream())
                    {
                        CopyStream(fileStream, dest);
                    }
                }
            }
      
        }

解压部分的代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
private static void DeCompression(string fileName)
        {
            ZipPackage zipFile;
     
            zipFile 
= ZipPackage.Open(fileName, FileMode.Open) as ZipPackage;

            
foreach(ZipPackagePart part in zipFile.GetParts())
            {
                Stream stream 
= part.GetStream();
                
long bufferSize = stream.Length < BUFFER_SIZE ? stream.Length : BUFFER_SIZE;
                
string fileNameLocal;
                
int bytesRead = 0;
                
byte[] buffer = new byte[bufferSize];
                
                fileNameLocal 
= part.Uri.ToString().Substring(1, part.Uri.ToString().Length - 1);
                
                FileStream fs 
= new FileStream(@"D:\"+fileNameLocal,FileMode.OpenOrCreate);         
                
while (true)
                {
                    bytesRead 
= stream.Read(buffer,0,BUFFER_SIZE);
                    
if (bytesRead == 0)
                        
break;
                    fs.Write(buffer, 
0, bytesRead);                 

                }
                fs.Close();  
            }           
        }

 

转载于:https://www.cnblogs.com/Farseer1215/archive/2009/11/18/1605532.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值