.net core 로 컬 지정 한 디 렉 터 리 에 있 는 파일 의 인 스 턴 스 코드 를 읽 습 니 다.
8062 단어 .netcore디 렉 터 리 파일
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 빈 사 이 트 를 만 듭 니 다.
로그 로그 파일 을 항목 아래 에 복사 합 니 다.
Startup 류 의 Configure Services()방법 을 수정 하고 로 컬 파일 에 접근 하 는 데 필요 한 서 비 스 를 등록 합 니 다.그 때 는 미들웨어 에 구조 함수 주입 을 통 해 미들웨어 에 추가 하면 한 곳 에서 파일 의 접근 경 로 를 제어 할 수 있 습 니 다(즉,응용 프로그램 이 시 작 될 때).
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 에 새 FileProvider Middleware.cs 미들웨어 클래스 를 만 듭 니 다.로그 에 있 는 모든 로그 파일 의 내용 을 읽 고 필요 한 내용 형식 으로 정리 합 니 다.코드 는 다음 과 같 습 니 다.
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 가 로 컬 지정 디 렉 터 리 에 있 는 파일 을 읽 는 것 에 관 한 지식 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.