C# 跨服务大文件复制
跨服务的大文件复制,肯定要和本地大文件复制一样,分多次传递,要不然内存也承受不了,下面就说下如何实现大文件的跨服务复制······
首先肯定要建立一个WCF的服务以及对应的客户端来测试服务,此方法请参考我的博客:
WCF服务的建立以及调用:http://www.cnblogs.com/sxw117886/p/5629481.html
看了此博客之后大家肯定已经建立了自己的服务以及客户端了,下面就是见证奇迹的时候了——————大文件复制
-------------------------------------------华丽的分割线---------------------------------------------------------------------------
1.首先我们要编写WCF代码(这个代码是和WCF服务的建立以及调用的代码放在一起的)
(1)添加一个服务对应的接口CopyFile(Stream stream):如服务 "WCFTestService.DbApiInfo"对应的接口:IApiInfo(就是上面提到的接口名称要和上面一致)
[ServiceContract]
public interface IApiInfo
{
[OperationContract]
[ServiceKnownType(typeof(string))]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
string CreateApi(Stream name); [OperationContract]
[ServiceKnownType(typeof(string))]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
void CopyFile(Stream stream); }
(2)添加接口对应的实现类:DbApiInfo.cs所对应的方法 public void CopyFile(Stream stream)
public class DbApiInfo:IApiInfo
{
public string CreateApi(Stream name)
{
//name.Position = 0;
StreamReader reader = new StreamReader(name);
string text = reader.ReadToEnd(); return "你的名字是:" + text;
} /// <summary>
/// 复制大文件,每次传入一定大小的文件流过来,追加到对应的问价里
/// </summary>
/// <param name="stream"></param>
public void CopyFile(Stream stream)
{
try
{
string FileStr = StreamToString(stream, Encoding.UTF8);
byte[] array = Convert.FromBase64String(FileStr); //把文件信息按照Base64解析成字节格式
//FileMode.Append这个是对大文件的一个追加写入。这是和本地大文件复制的一个主要区别
using (FileStream fsWrite = new FileStream(@"D:\360安全浏览器下载\4.avi", FileMode.Append, FileAccess.Write))
{
fsWrite.Write(array, , array.Count());//追加写入文件
}
}
catch (System.Exception ex)
{
}
} /// <summary>
/// 将请求的流转化为字符串
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public static string StreamToString(Stream stream, Encoding encoding)
{
string result = string.Empty;
try
{
using (StreamReader sr = new StreamReader(stream, encoding))
{
result = sr.ReadToEnd();
sr.Close();
}
}
catch { }
return result;
}
2.添加客户端的代码
private void button2_Click(object sender, EventArgs e)
{
//读取复制文件流
using (FileStream fsRead = new FileStream(@"D:\360安全浏览器下载\视频\2.avi", FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[ * * ]; //每次读取2M
//可能文件比较大,要循环读取,每次读取2M
while (true)
{
//每次读取的数据 n:是每次读取到的实际数据大小
int n = fsRead.Read(buffer, , buffer.Count());
//如果n=0说明读取的数据为空,已经读取到最后了,跳出循环
if (n == )
{
break;
}
string base64buffer = Convert.ToBase64String(buffer);
PostHttp("http://localhost:8888/Service/DbApiInfo/CopyFile", base64buffer);
}
MessageBox.Show("复制完成");
}
}
根据方法可以看到,每次循环会读取2M的数据流并调用服务端接口传递给服务端,这样大文件局可以分多次传递过去,不会对内存产生太大压力······
最后在启动服务和客户端,让我们见证奇迹:
启动客户端时,我们看到界面:

在点击“大文件复制”按钮之前,文件加只有一个2.avi视频文件:

点击“大文件复制”按钮之后,界面会弹出“复制成功”界面。

我们再看一下对应的文件夹:

两个文件出现了·······这就是大文件跨服务的复制方法·······
C# 跨服务大文件复制的更多相关文章
- FileStream大文件复制
FileStream缓冲读取和写入可以提高性能.FileStream读取文件的时候,是先讲流放入内存,经Flash()方法后将内存中(缓冲中)的数据写入文件.如果文件非常大,势必消耗性能.特封装在Fi ...
- java 1G大文件复制
对比几种复制方法 复制的文件是980m的txt文件 1. FileChannel 方法 代码: public static void mappedBuffer() throws IOExceptio ...
- Java IO的应用之实现大文件复制
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827481.html 用IO进行文件复制,实质就是用FileInputStream链接要复制的文件,按一定规 ...
- java IO(二)大文件复制
package cn.sasa.demo3; import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...
- 跨 PostgreSQL 大版本复制怎么做?| 逻辑复制
当需要升级PostgreSQL时,可以使用多种方法.为了避免应用程序停机,不是所有升级postgres的方法都适合,如果避免停机是必须的,那么可以考虑使用复制作为升级方法,并且根据方案,可以选择使用逻 ...
- java操作大文件复制
https://www.cnblogs.com/coprince/p/6594348.html https://blog.csdn.net/w592376568/article/details/796 ...
- 使用QQ传输大文件
现在在公网上能传输大文件并且稳定支持断点续传的软件非常少了,可以使用qq来做这件事. qq传输单个文件有时候提示不能超过4g有时候提示不能超过60g,没搞明白具体怎么样. 可以使用qq的传输文件夹功能 ...
- python 读取大文件,按照字节读取
def read_bigFile(): f = open("123.dat",'r') cont = f.read() : print(cont) cont = f.read() ...
- linux大文件传输
Mysql复制,初始化服务器,备份/还原等大文件复制是很常见的任务,他们完成的实际任务可以概括为: 1,(可选)压缩文件 2,发送文件 3,解压文件 4,验证文件一致性 下面介绍几种方法: 1,最简单 ...
随机推荐
- 【转】Odoo装饰器: one装饰
one装饰器的作用是对每一条记录都执行对应的方法,相当于traditional-style中的function,无返回值! 应用举例: 定义的columns now = fields.Datetime ...
- 成都Uber优步司机奖励政策(1月14日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- hdu1874畅通工程续(floyd)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- python操作符及其循环语句(非常全)
//2018.10.14 1. Windows + R可以直接进行运行cmd 2. Random.randint(a,b):产生a-b的任意一个整数,在IDLE里面运行时需要注意在前面写好调用impo ...
- 第5章 Linux网络编程基础
第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...
- Unity操作小技巧
1.操作类 1)F:选择物体后聚焦 2)V:选择物体的顶点,顶点吸附 3)Ctrl:摁住后拖动物体,可以按照系统设置的步长进行移动(Edit -> Snap setting) 4)Q W E R ...
- win 下通过dos命令格式化磁盘
该命令可以解决好多问题,比如: 1.u盘作为启动后,如何恢复成正常的u盘 1.win + r ->cmd 进入dos模式 2.输入diskpart后回车,点击确定,进入diskpart命令的交互 ...
- TW实习日记:第27天
今天依旧是磨洋工的一天,说真的,被存在各种问题的后端接口把耐心和动力都给磨没了.于是一天就又在沟通接口问题中度过了,完善了一个新功能,将一个新功能开发到了一半.效率可真是够低的,唉.然后不知道为什么突 ...
- [Clr via C#读书笔记]Cp10属性
Cp10属性 属性的本质就是方法,只是看起来像字段罢了: 无参属性 就是一般属性: 字段一般要private,然后通过设置访问方法-访问器来访问:属性是方法语法变种:getset不一定要访问支持字段: ...
- JavaScript筑基篇(三)->JS原型和原型链的理解
删除理由:很久以前写的,当时理解不够深入,这样描述反而看起来更复杂了.因此就删掉,免得误人子弟! 可以看看另一篇文章:[如何继承Date对象?由一道题彻底弄懂JS继承.](http://www.cnb ...