跨服务的大文件复制,肯定要和本地大文件复制一样,分多次传递,要不然内存也承受不了,下面就说下如何实现大文件的跨服务复制······

首先肯定要建立一个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# 跨服务大文件复制的更多相关文章

  1. FileStream大文件复制

    FileStream缓冲读取和写入可以提高性能.FileStream读取文件的时候,是先讲流放入内存,经Flash()方法后将内存中(缓冲中)的数据写入文件.如果文件非常大,势必消耗性能.特封装在Fi ...

  2. java 1G大文件复制

    对比几种复制方法 复制的文件是980m的txt文件 1.  FileChannel 方法 代码: public static void mappedBuffer() throws IOExceptio ...

  3. Java IO的应用之实现大文件复制

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827481.html  用IO进行文件复制,实质就是用FileInputStream链接要复制的文件,按一定规 ...

  4. java IO(二)大文件复制

    package cn.sasa.demo3; import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...

  5. 跨 PostgreSQL 大版本复制怎么做?| 逻辑复制

    当需要升级PostgreSQL时,可以使用多种方法.为了避免应用程序停机,不是所有升级postgres的方法都适合,如果避免停机是必须的,那么可以考虑使用复制作为升级方法,并且根据方案,可以选择使用逻 ...

  6. java操作大文件复制

    https://www.cnblogs.com/coprince/p/6594348.html https://blog.csdn.net/w592376568/article/details/796 ...

  7. 使用QQ传输大文件

    现在在公网上能传输大文件并且稳定支持断点续传的软件非常少了,可以使用qq来做这件事. qq传输单个文件有时候提示不能超过4g有时候提示不能超过60g,没搞明白具体怎么样. 可以使用qq的传输文件夹功能 ...

  8. python 读取大文件,按照字节读取

    def read_bigFile(): f = open("123.dat",'r') cont = f.read() : print(cont) cont = f.read() ...

  9. linux大文件传输

    Mysql复制,初始化服务器,备份/还原等大文件复制是很常见的任务,他们完成的实际任务可以概括为: 1,(可选)压缩文件 2,发送文件 3,解压文件 4,验证文件一致性 下面介绍几种方法: 1,最简单 ...

随机推荐

  1. 【转载】SOCKS代理:从***到内网漫游

    原文:SOCKS代理:从***到内网漫游 本文原创作者:tahf,本文属FreeBuf原创奖励计划,未经许可禁止转载 之前在Freebuf上学习过很多大牛写的关于Tunnel.SOCKS代理.***等 ...

  2. Ubuntu adb 报错:no permissions (user in plugdev group; are your udev rules wrong?);

    Ubuntu 下 adb 报错: caoxinyu@caoxinyu-ThinkPad-T470p:~/Android/Sdk/platform-tools$ ./adb devices List o ...

  3. spring源码-BeanFactoryPostProcessor-3.2

    一.BeanFactoryPostProcessor这个是spring容器的拓展之一,其目的是在容器初始化完成之前,通过beanFactory对上下文进行进行操作. 二.常用场景,需要对beanDef ...

  4. autocomplete.jquery 点击或进入默认显示所有结果

    注意使用的是autocomplete.jquery,官网地址是:https://github.com/devbridge/jQuery-Autocomplete.而不是JqueryUI的autocom ...

  5. DSP5509的ADC实验

    1. 本次使用esay5509开发板,具体做这个板子叫做大道科技. 2. 5509有2个ADC的输入引脚,就是2个采集通道 3. 看下ADC的寄存器 4. 看下代码中怎么引用ADC的寄存器的,这种写法 ...

  6. 解决美图看看不出现在“Open with”的子菜单中的问题

    最近由于特殊需求,要使用美图看看,Win10系统,美图看看工作倒也正常,但出现一个比较郁闷的情况,就是只能在“Open with”的最下面一个子菜单中选择“Choose another app”,然后 ...

  7. JavaWeb——JavaWeb开发入门

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  8. Linux命令应用大词典-第11章 Shell编程

    11.1 declare:显示或设置Shell变量 11.2 export:显示或设置环境变量 11.3 set:显示和设置Shell变量 11.4 unset:删除变量或函数 11.5 env:查看 ...

  9. 初学Direct X(3)

    初学Direct X(3) 1.获取外设输入--键盘以及鼠标 无论是获取鼠标还是键盘的设备,首先得初始化DirectInput,不过先把必要的环境先配置好: 所要用到的头文件以及库文件是(相比于前两次 ...

  10. hello word!------为什么开通博客以及自我介绍

    来北京已经一年半的日子了,已经完全成功熟练的成为了另一个我,没有了半年前刚来时的那种焦虑.急躁和格格不入. 回想起来那段时间,大概是我人生中非常重要的时期了,去年那个夏天,只身一人背上行囊踏上了北上的 ...