1. 程式人生 > >【C#程式設計最佳實踐 九】DFS分散式檔案系統

【C#程式設計最佳實踐 九】DFS分散式檔案系統

最近在專案中使用到了DFS分散式檔案系統,這裡蒐集一些資料瞭解一下這個系統以及如何在我的專案裡使用。

DFS定義

Microsoft檔案分佈系統 (Dfs) 是一個網路伺服器元件,它能夠使你更容易地在網路上查詢和管理資料。分散式檔案系統是將分佈於不同電腦上的檔案組合為單一的名稱空間,並使得在網路上建立一個單一的、層次化多重檔案伺服器和伺服器共享的工作更為方便的途徑。

DFS優勢

分散式檔案系統(DFS,Distributed File System)使使用者更加容易訪問和管理物理上跨網路分佈的檔案。DFS為檔案系統提供了單個訪問點一個邏輯樹結構,通過DFS,使用者在訪問檔案時不需要知道它們的實際物理位置,即分佈在多個伺服器上的檔案在使用者面前就如同在網路的同一個位置

。通過DFS,可以將同一網路中的不同計算機上的共享資料夾組織起來,形成一個單獨的、邏輯的、層次式的共享檔案系統。

DFS操作

DFS是一個樹狀結構,包含一個根目錄一個或多個DFS連結

1,要建立DFS共享,必須首先建立DFS根。

2,然後在每一個DFS根下,建立一個或多個DFS連結,每一個連結可以指向網路中的一個共享資料夾。

注意:Dfs連結的最大數目是1000。如果Dfs連結的目標資料夾不是Windows 2000資料夾,則該目標資料夾不能有子資料夾。

這裡寫圖片描述

DFS實踐

對應於專案體系中,dfs在實踐的過程中,有以下幾個過程

DFS儲存

1,第一步:將物件序列化為字串並壓縮

===========================獲取對比結果物件=======================
Person p = new  Person();
=========================將該物件序列化為字串=======================
string serializeStr= Maolin.Common.Serialize.SerializeHelper.Serialize(p);  // 獲取序列化的字串
=========================壓縮字串資料=======================
string str = GZipCompressHelper.GZipCompressString(serializeStr);   //壓縮字串資料

2,第二步,將該壓縮字串轉換為二進位制陣列,進而轉換為流物件

byte[] bData = System.Text.Encoding.UTF8.GetBytes(str);  //轉換為二進位制位元流,以UTF-8的編碼樣式
MemoryStream ms = new MemoryStream(bData);

MemoryStream類用於向記憶體而不是磁碟讀寫資料。MemoryStream封裝以無符號位元組陣列形式儲存的資料,該陣列在建立MemoryStream物件時被初始化,或者該陣列可建立為空陣列。可在記憶體中直接訪問這些封裝的資料。記憶體流可降低應用程式中對臨時緩衝區和臨時檔案的需要

3,第三步,建立檔名,呼叫方法,將該流物件儲存到dfs上,並將dfs物件字串化後儲存到資料庫中

 var fileName = tenantId + "_" + importLogID.ToString();  //檔名 :租戶ID+日誌id

 var dfsPath = Dfs.Store(new DfsItem(BaseConst.PublicDfsKeyspace, fileName + ".json", ms, tenantId));  //將檔案存到該dfs路徑


 CompareToolImportLogProvider.Instance.Create(status, dfsPath.ToString(), createdBy, importLogID);
 //將生成完成後的各項資料存入資料庫中

DFS讀取

1,第一步:依據id從資料庫取出該條資料及其dfspath

===========================讀取資料庫物件=======================
var compareToolImportLogProvider = CompareToolImportLogProvider.Instance.GetById(id);  //依據日誌id拿到該條對比工具的日誌記錄
=========================從該物件中拿到dfs路徑=======================
var dfsPath = compareToolImportLogProvider.DfsPath;  //讀取到dfs的路徑

2,第二步,將路徑直接轉換為二進位制陣列

var item = GetDfsItem(dfsPath);//將dfs路徑傳入獲取二進位制陣列

用到的輔助方法

 /// <summary>
        /// 私有方法:獲取二進位制資料
        /// </summary>
        /// <param name="dfsPath"></param>
        /// <returns></returns>
        private byte[] GetDfsItem(string dfsPath)
        {
            byte[] fileData = null;
            try
            {
                Dfs.Get(new[] { dfsPath }, (operationResult, item) =>
                {
                    if (!operationResult.Succeeded)
                        return;

                    if (item.IsStream)
                    {
                        fileData = new byte[item.Length];
                        int index = 0;
                        while (index < item.Length)
                        {
                            int read = item.FileDataStream.Read(fileData, index,
                                                                (int)
                                                                (item.Length - index));
                            index += read;
                        }
                    }
                    else
                    {
                        fileData = item.FileDataBytes;
                    }
                });
            }
            catch (Exception ex) { }

            if (fileData == null)
            {
                throw new Maolin.DfsClient.DfsException($"DFS檔案不存在.dfsPath:[{dfsPath}]");
            }
            return fileData;
        }

3,第三步,將二進位制陣列轉換為字串,解壓縮,進而反序列化為物件

  var str = System.Text.Encoding.UTF8.GetString(item);  //將二進位制陣列轉為字串
  var strlcm = GZipCompressHelper.GZipDecompressString(str);  //將該字串解壓縮
   var person = Maolin.Common.Serialize.SerializeHelper.Deserialize<Person>(strlcm);//反序列化為實體

這就是一個完整的物件儲存到檔案系統上並且讀取的全過程了,之後如果遇到需要dfs的,相信應該會比較熟練