zoukankan      html  css  js  c++  java
  • .net core 读取本地指定目录下的文件

    项目需求

    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!");
      });
    }

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

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

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

    博客地址:http://snaill.net/post/7

  • 相关阅读:
    easy ui 表单ajax和from两种提交数据方法
    easy ui 下拉级联效果 ,下拉框绑定数据select控件
    easy ui 下拉框绑定数据select控件
    easy ui 异步上传文件,跨域
    easy ui 菜单和按钮(Menu and Button)
    HTTP 错误 404.3
    EXTJS4.2 后台管理菜单栏
    HTML 背景图片自适应
    easy ui 表单元素input控件后面加说明(红色)
    EXTJS 4.2 添加滚动条
  • 原文地址:https://www.cnblogs.com/alan-lin/p/9650954.html
Copyright © 2011-2022 走看看