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,最简单 ...
随机推荐
- python通过mongoengine中connect函数连接多个数据库
mongoengine支持程序同时连接多个数据库,这些数据库可以位于一个或多个mongo之中,通过alias名称区分不同的连接即可. 可以通过switch_db切换到不同的数据库,进行读写操作,swi ...
- 成都Uber优步司机奖励政策(4月1日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- java-IO处理类的序列化与反序列化
package TestIo; import java.io.*; /** * 序列化 * * * 对象序列化 * * 一 创建对象 需要说明,想序列化的对象一定要是实现Serivalizable接口 ...
- 「日常训练」Watering Flowers(Codeforces Round #340 Div.2 C)
题意与分析 (CodeForces 617C) 题意是这样的:一个花圃中有若干花和两个喷泉,你可以调节水的压力使得两个喷泉各自分别以\(r_1\)和\(r_2\)为最远距离向外喷水.你需要调整\(r_ ...
- Appium(Python)驱动手机Chrome浏览器
手机Chrome浏览器访问淘宝H5与在电脑上访问淘宝H5是一摸一样的: 第一种方法: 直接在电脑Chrome浏览器上打开F12: 第二种方法: 手机连接电脑后, 在手机Chrome浏览器上打开淘宝H5 ...
- Kotlin对象:仅一行代码就可创建安全的单例
作者:Antonio Leiva 时间:Jun 20, 2017 原文链接:https://antonioleiva.com/objects-kotlin/ Kotlin对象是Android开发人员不 ...
- Linux管道及I/O重定向
I/O: 系统设定 默认输入设备:标准输入,STDIN,0 默认输出设备:标准输出,STDOUT,1 标准错误输出:STDERR,2 属于不同的数据流 标准输入:键盘 标准输出和错误输出:显示器 I/ ...
- Response对象及常用方法
void addCookie(Cookie cookie)给客户端添加一个Cookie对象,以保存客户端的信息 void addDateHeader(String name,long value) 添 ...
- 《Effective C++》读书笔记 条款02 尽量以const,enum,inline替换#define
Effective C++在此条款中总结出两个结论 1.对于单纯常量,最好以const对象或enum替换#define 2.对于形似函数的宏,最好改用inline函数替换#define 接下来我们进行 ...
- 机器学习实战笔记一:K-近邻算法在约会网站上的应用
K-近邻算法概述 简单的说,K-近邻算法采用不同特征值之间的距离方法进行分类 K-近邻算法 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用范围:数值型和标称型 ...