程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 跨服務大文件復制,

C# 跨服務大文件復制,

編輯:C#入門知識

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視頻文件:

點擊“大文件復制”按鈕之後,界面會彈出“復制成功”界面。

我們再看一下對應的文件夾:

兩個文件出現了·······這就是大文件跨服務的復制方法·······

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved