音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

.net core 读取本地指定目录下的文件的实例代码
日期:2021-09-07 22:39:34   来源:脚本之家

项目需求

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

项目结构

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

项目实现

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

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

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

public void ConfigureServices(IServiceCollection services)
{
  services.AddSingleton<IFileProvider>(new PhysicalFileProvider(Directory.GetCurrentDirectory()));
}

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

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 下所有日志文件内容,并整理成所需的内容格式,代码如下

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管道中使用文件中间件服务

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  if (env.IsDevelopment())
  {
    app.UseDeveloperExceptionPage();
  }

  app.UseFileProvider();
  
  app.Run(async (context) =>
  {
    await context.Response.WriteAsync("Hello World!");
  });
}

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

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

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

总结

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

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程