服务器之家

服务器之家 > 正文

.net core 读取本地指定目录下的文件的实例代码

时间:2020-06-02 13:42     来源/作者:蜗牛丨

项目需求

asp.net core 读取log目录下的.log文件,.log文件的内容如下:

xxx.log

------------------------------------------begin---------------------------------
写入时间:2018-09-11 17:01:48
 userid=1000
 golds=10
 -------------------------------------------end---------------------------------

一个 begin end 为一组,同一个.log文件里 userid 相同的,取写入时间最大一组值,所需结果如下:

UserID   Golds   RecordDate
 1001     20     2018/9/11 17:10:48 
 1000     20     2018/9/11 17:11:48 
 1003     30     2018/9/11 17:12:48 
 1002     10     2018/9/11 18:01:48
 1001     20     2018/9/12 17:10:48 
 1000     30     2018/9/12 17:12:48 
 1002     10     2018/9/12 18:01:48

项目结构

.net core 读取本地指定目录下的文件的实例代码

Snai.File.FileOperation  Asp.net core 2.0 网站

项目实现

新建Snai.File解决方案,在解决方案下新建一个名Snai.File.FileOperation Asp.net core 2.0 空网站

把log日志文件拷备到项目下

修改Startup类的ConfigureServices()方法,注册访问本地文件所需的服务,到时在中间件中通过构造函数注入添加到中间件,这样就可以在一个地方控制文件的访问路径(也就是应用程序启动的时候)

?
1
2
3
4
public void ConfigureServices(IServiceCollection services)
{
  services.AddSingleton<IFileProvider>(new PhysicalFileProvider(Directory.GetCurrentDirectory()));
}

新建 Middleware 文件夹,在 Middleware下新建 Entity 文件夹,新建 UserGolds.cs 类,用来保存读取的日志内容,代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace Snai.File.FileOperation.Middleware.Entity
{
 public class UserGolds
 {
  public UserGolds()
  {
   RecordDate = new DateTime(1970, 01, 01);
   UserID = 0;
   Golds = 0;
  }
  public DateTime RecordDate { get; set; }
  public int UserID { get; set; }
  public int Golds { get; set; }
 }
}

 在 Middleware 下新建 FileProviderMiddleware.cs 中间件类,用于读取 log 下所有日志文件内容,并整理成所需的内容格式,代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
namespace Snai.File.FileOperation.Middleware
{
 public class FileProviderMiddleware
 {
  private readonly RequestDelegate _next;
  private readonly IFileProvider _fileProvider;
  public FileProviderMiddleware(RequestDelegate next, IFileProvider fileProvider)
  {
   _next = next;
   _fileProvider = fileProvider;
  }
  public async Task Invoke(HttpContext context)
  {
   var output = new StringBuilder("");
   //ResolveDirectory(output, "", "");
   ResolveFileInfo(output, "log", ".log");
   await context.Response.WriteAsync(output.ToString());
  }
  //读取目录下所有文件内容
  private void ResolveFileInfo(StringBuilder output, string path, string suffix)
  {
   output.AppendLine("UserID Golds RecordDate");
   IDirectoryContents dir = _fileProvider.GetDirectoryContents(path);
   foreach (IFileInfo item in dir)
   {
    if (item.IsDirectory)
    {
     ResolveFileInfo(output,
      item.PhysicalPath.Substring(Directory.GetCurrentDirectory().Length),
      suffix);
    }
    else
    {
     if (item.Name.Contains(suffix))
     {
      var userList = new List<UserGolds>();
      var user = new UserGolds();
      IFileInfo file = _fileProvider.GetFileInfo(path + "\\" + item.Name);
      using (var stream = file.CreateReadStream())
      {
       using (var reader = new StreamReader(stream))
       {
        string content = reader.ReadLine();
        while (content != null)
        {
         if (content.Contains("begin"))
         {
          user = new UserGolds();
         }
         if (content.Contains("写入时间"))
         {
          DateTime recordDate;
          string strRecordDate = content.Substring(content.IndexOf(":") + 1).Trim();
          if (DateTime.TryParse(strRecordDate, out recordDate))
          {
           user.RecordDate = recordDate;
          }
         }
         if (content.Contains("userid"))
         {
          int userID;
          string strUserID = content.Substring(content.LastIndexOf("=") + 1).Trim();
          if (int.TryParse(strUserID, out userID))
          {
           user.UserID = userID;
          }
         }
         if (content.Contains("golds"))
         {
          int golds;
          string strGolds = content.Substring(content.LastIndexOf("=") + 1).Trim();
          if (int.TryParse(strGolds, out golds))
          {
           user.Golds = golds;
          }
         }
         if (content.Contains("end"))
         {
          var userMax = userList.FirstOrDefault(u => u.UserID == user.UserID);
          if (userMax == null || userMax.UserID <= 0)
          {
           userList.Add(user);
          }
          else if (userMax.RecordDate < user.RecordDate)
          {
           userList.Remove(userMax);
           userList.Add(user);
          }
         }
         content = reader.ReadLine();
        }
       }
      }
      if (userList != null && userList.Count > 0)
      {
       foreach (var golds in userList.OrderBy(u => u.RecordDate))
       {
        output.AppendLine(golds.UserID.ToString() + " " + golds.Golds + " " + golds.RecordDate);
       }
       output.AppendLine("");
      }
     }
    }
   }
  }
  //读取目录下所有文件名
  private void ResolveDirectory(StringBuilder output, string path, string prefix)
  {
   IDirectoryContents dir = _fileProvider.GetDirectoryContents(path);
   foreach (IFileInfo item in dir)
   {
    if (item.IsDirectory)
    {
     output.AppendLine(prefix + "[" + item.Name + "]");
     ResolveDirectory(output,
      item.PhysicalPath.Substring(Directory.GetCurrentDirectory().Length),
      prefix + " ");
    }
    else
    {
     output.AppendLine(path + prefix + item.Name);
    }
   }
  }
 }
 public static class UseFileProviderExtensions
 {
  public static IApplicationBuilder UseFileProvider(this IApplicationBuilder app)
  {
   return app.UseMiddleware<FileProviderMiddleware>();
  }
 }
}

上面有两个方法 ResolveFileInfo()和ResolveDirectory()

ResolveFileInfo()  读取目录下所有文件内容,也就是需求所用的方法

ResolveDirectory() 读取目录下所有文件名,是输出目录下所有目录和文件名,不是需求所需但也可以用

修改Startup类的Configure()方法,在app管道中使用文件中间件服务

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  if (env.IsDevelopment())
  {
    app.UseDeveloperExceptionPage();
  }
 
  app.UseFileProvider();
  
  app.Run(async (context) =>
  {
    await context.Response.WriteAsync("Hello World!");
  });
}

到此所有代码都已编写完成

启动运行项目,得到所需结果,页面结果如下

.net core 读取本地指定目录下的文件的实例代码

源码访问地址:https://github.com/Liu-Alan/Snai.File

总结

以上所述是小编给大家介绍的.net core 读取本地指定目录下的文件的相关知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

原文链接:https://www.cnblogs.com/alan-lin/archive/2018/09/15/9650954.html

标签:

相关文章

热门资讯

歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
返回顶部