C# 跨服务好文件复制

 

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, 0, 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;
        }

我们更看一下遥相呼应的文件夹:

 

[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);

    }

图片 1

图片 2

2.添加客户端的代码

WCF服务之树及调用:http://www.cnblogs.com/sxw117886/p/5629481.html

(1)添加一个劳务对应的接口CopyFile(Stream
stream):如服务 “WCFTestService(Service).DbApiInfo”对应之接口:IApiInfo(就是上边提到的接口名称要同方面一样)

(2)添加接口对应的实现类似:DbApiInfo.cs所对应之道 public void
CopyFile(Stream stream)

依照办法好观看,每一回循环会读取2M之多少流并调用服务端接口传递让服务端,这样大文件局可以分多次传递过去,不会晤对内存有最万分压力······

有限个文本出现了·······这就是可怜文件跨服务的复制方法·······

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

 

 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[1024 * 1024 * 2]; //每次读取2M
                //可能文件比较大,要循环读取,每次读取2M
                while (true)
                {
                    //每次读取的数据    n:是每次读取到的实际数据大小
                    int n = fsRead.Read(buffer, 0, buffer.Count());
                    //如果n=0说明读取的数据为空,已经读取到最后了,跳出循环
                    if (n == 0)
                    {
                        break;
                    }
                    string base64buffer = Convert.ToBase64String(buffer);
                    PostHttp("http://localhost:8888/Service/DbApiInfo/CopyFile", base64buffer);
                }
                MessageBox.Show("复制完成");
            }
        }

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

——————————————-华丽的分割线—————————————————————————

1.先是我们若编WCF代码(这个代码是与WCF服务的创建和调用的代码放在一块儿的)

首先肯定要起一个WCF的服务与对应的客户端来测试服务,此道要参考我之博客:

图片 3

 

最终以启动服务与客户端,让大家见证奇迹:

图片 4

扣押了这么些博客之后我们一定就立了好之劳务与客户端了,下边就是见证奇迹的下了——————大文件复制

起步客户端时,我们来看界面:

超过服务的卓殊文件复制,肯定使跟本土大文件复制一样,分多次传递,要不然内存也承受无了,下边就是说下什么促成大文件之跳服务复制······

相关文章