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,最简单 ...
随机推荐
- 北京Uber优步司机奖励政策(1月25日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 北京Uber优步司机奖励政策(1月18日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- LeetCode: 51. N-Queens(Medium)
1. 原题链接 https://leetcode.com/problems/n-queens/description/ 2. 题目要求 游戏规则:当两个皇后位于同一条线上时(同一列.同一行.同一45度 ...
- LeetCode:35. Search Insert Position(Easy)
1. 原题链接 https://leetcode.com/problems/search-insert-position/description/ 2. 题目要求 给定一个已经排好序的数组和一个目标值 ...
- 《绝地求生大逃杀》BE错误怎么办 BE服务未正常运行及安装失败解决方法
<绝地求生大逃杀>BattlEye Launcher是游戏的反作弊程序,也是启动过程中做容易出现错误的,今天小编带来“爆锤吧务”分享的<绝地求生大逃杀>BE服务未正常运行及安装 ...
- MongoDB之我是怎么成为Primary节点的
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Primary(主)是MongoDB复制集中的最重要的角色,是能够接受客户端/Driver写请求的节点,(读 ...
- 「日常训练」 Counting Cliques(HDU-5952)
题意与分析 题源:2016ACM/ICPC沈阳现场赛. 这题让我知道了什么是团,不过最恶心的还是这题的数据了,卡了无数次- - 解决方法是维护一个G数组,不能去遍历邻接矩阵.至少我改了这么一个地方就过 ...
- [JSON].remove( keyPath )
语法:[JSON].remove( keyPath ) 返回:无 说明:移除指定路径的键 示例: Set jsonObj = toJson("{div:{'#text-1': 'is tex ...
- C++字符串拼接和输入
一 .char类型字符串以空字符结尾 1.以空字符结尾,空字符被写作\0,其ASCII码为0,用来标记字符串的结尾. char dog[4]={'a','b','c','d'} //不是一个字符串 ...
- Java并发简介
年轻的时候学会了“使用”Servlet后,感觉自己什么都会做了,之后就不停的写所谓的业务逻辑,框架(这里说的不是structs,spring等,就是说servlet)给人们屏蔽了很多复杂性(更别说构建 ...