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

    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[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("复制完成");
                }
            }

    根据方法可以看到,每次循环会读取2M的数据流并调用服务端接口传递给服务端,这样大文件局可以分多次传递过去,不会对内存产生太大压力······

    最后在启动服务和客户端,让我们见证奇迹:

    启动客户端时,我们看到界面:

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

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

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

    两个文件出现了·······这就是大文件跨服务的复制方法·······

  • 相关阅读:
    Junit单元测试
    点餐系统
    文件的横纵转换
    零碎知识--日积月累
    json校验
    程序员必须收藏的14个顶级开发社区!
    管理员权限
    Thinking In Java 读书笔记
    学生考试系统
    JeeSite开发笔记
  • 原文地址:https://www.cnblogs.com/sxw117886/p/5646081.html
Copyright © 2020-2023  润新知