.net core 读取本地指定目录下的文件

时间:2023-03-09 06:10:42
.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

项目结构

aaarticlea/png;base64,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" alt="" />

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

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

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

aaarticlea/png;base64,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" alt="" />

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

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