【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的,相信应该会比较熟练

相关文章
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
37 3
|
5天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
37 12
|
5天前
|
人工智能 分布式计算 数据处理
云产品评测:MaxFrame — 分布式Python计算服务的最佳实践与体验
阿里云推出的MaxFrame是一款高性能分布式计算平台,专为大规模数据处理和AI应用设计。它提供了强大的Python编程接口,支持分布式Pandas操作,显著提升数据处理速度(3-5倍)。MaxFrame在大语言模型数据处理中表现出色,具备高效内存管理和任务调度能力。然而,在开通流程、API文档及功能集成度方面仍有改进空间。总体而言,MaxFrame在易用性和计算效率上具有明显优势,但在开放性和社区支持方面有待加强。
30 9
|
7天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
34 2
|
2月前
|
消息中间件 网络协议 C#
C#使用Socket实现分布式事件总线,不依赖第三方MQ
`CodeWF.EventBus.Socket` 是一个轻量级的、基于Socket的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布/订阅模式进行通信,无需依赖外部消息队列服务。
C#使用Socket实现分布式事件总线,不依赖第三方MQ
|
1月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
52 4
|
2月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
87 2
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
53 2
|
2月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
149 0
|
3月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
60 1