最近在项目中使用到了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的,相信应该会比较熟练