最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-27 22:34:55
文档

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

.net core 读取本地指定目录下的文件的实例代码:项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------begin--------------------------------- 写入时间:2018-09-11 17:01:48 userid=1
推荐度:
导读.net core 读取本地指定目录下的文件的实例代码:项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------begin--------------------------------- 写入时间:2018-09-11 17:01:48 userid=1


项目结构

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 读取本地指定目录下的文件的相关知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

文档

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

.net core 读取本地指定目录下的文件的实例代码:项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------begin--------------------------------- 写入时间:2018-09-11 17:01:48 userid=1
推荐度:
标签: 文件 本地 File
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top