写点什么

C# 读取文件

作者:青柚1943
  • 2022-10-24
    湖南
  • 本文字数:1967 字

    阅读完需:约 6 分钟

1 当前项目下文件读取

private static async Task<string> ReaderLoacalMetadataAsync(){    string filePath = $"{Directory.GetCurrentDirectory()}\\StaticFiles\\metadata.json";
if (!File.Exists(filePath)) return string.Empty;
using var streamReader = new StreamReader(filePath, Encoding.UTF8); return await streamReader.ReadToEndAsync();}
复制代码

2 程序集嵌入文件读取

2.1 项目文件下添加嵌入式资源

<ItemGroup>    <EmbeddedResource Include="StaticFiles\metadata.json" /></ItemGroup>
复制代码

2.2 文件资源读取

//using System.Reflection;
/// <summary>/// 读取本地文件资源/// </summary>/// <param name="folderName">目录名称</param>/// <param name="fileName">文件名(不能包含“.”)</param>/// <returns></returns>
private static async Task<string> ReadLoacalResourceAsync(string folderName, string fileName){ using var stream = ReadResource(folderName, fileName);
if (stream == null) return string.Empty;
using var streamReader = new StreamReader(stream); return await streamReader.ReadToEndAsync();}

//目录为空 则直接拼文件名//注:此处文件名不能包含“.”,否则Stream会返回nullprivate static Stream ReadResource(string folderName, string fileName){ var currentAssembly = Assembly.GetCallingAssembly(); //路径区分大小写 return currentAssembly.GetManifestResourceStream($"{currentAssembly.GetName().Name}.{folderName}.{fileName}");}
复制代码


3* 树的序列化

3.1 Json 文件(metadata.json)

{  "uri": "metadata://bds",  "type": "app",  "label": "基础数据中心",  "children": [    {      "id": "first",      "uri": "metadata://bds/first",      "type": "module",      "label": "首营基础数据",      "children": [        {          "id": "product-browse",          "uri": "metadata://bds/first/product-browse",          "type": "route",          "path": "/product",          "label": "产品列表"        },        {          "id": "product-browse",          "uri": "metadata://bds/first/product-browse",          "type": "function",          "label": "浏览产品"        },        {          "id": "product-browse-all",          "uri": "metadata://bds/first/product-browse-all",          "type": "function",          "label": "浏览全局产品"        },        {          "id": "product-add",          "uri": "metadata://bds/first/product-add",          "type": "function",          "label": "添加产品"        },        {          "id": "product-delete",          "uri": "metadata://bds/first/product-delete",          "type": "function",          "label": "删除产品"        }      ]    }  ]}
复制代码

3.2 树节点抽象

/// <summary>    /// 能力中心元数据节点    /// </summary>    public class MetadataNode    {        [JsonPropertyName("id")]        public string Id { get; set; }
[JsonPropertyName("uri")] public string URI { get; set; }
[JsonPropertyName("type")] public string Type { get; set; }
[JsonPropertyName("label")] public string Label { get; set; } [JsonPropertyName("path")] public string Path { get; set; }
[JsonPropertyName("children")] public List<MetadataNode> Children { get; set; } = new List<MetadataNode>(); }
复制代码


3.3 反序列化(System.Text.Json)

//using System.Text.Json;
public async Task<string> GetMetadataAsync(){
var metadataTree = new MetadataNode() { Label = "根目录", Type = "root" };
var localMetadata = await ReadLoacalMetadata("StaticFiles", "metadata.json");
if (localMetadata != string.Empty) { var metadataNode = JsonSerializer.Deserialize<MetadataNode>(localMetadata) ?? new(); metadataTree.Children.Add(metadataNode); }
//TODO:通过Dapr调用获取其他能力中心的元数据
return JsonSerializer.Serialize(metadataTree);}
复制代码

3.4 前端效果

Tree


【字满发车】为什么要 50 个字才能发文呢。。。有点难受!

【字满发车】为什么要 50 个字才能发文呢。。。有点难受!

【字满发车】为什么要 50 个字才能发文呢。。。有点难受!

用户头像

青柚1943

关注

生命不息,代码不止。 2020-08-04 加入

老街坊,小弄堂,是属于那年代白墙黑瓦的淡淡的忧伤。

评论

发布
暂无评论
C# 读取文件_青柚1943_InfoQ写作社区