打造一个简单的TXT文本操作及日志框架

首先先介绍一下这个项目,该项目实现了文本写入及读取,日志写入指定文件夹或默认文件夹,日志数量控制,单个日志大小控制,通过约定的参数让用户可以用更少的代码解决问题。

1.读取文本文件方法

使用:JIYUWU.TXT.TXTHelper.ReadToString(“文件物理路径”)

 1  public static string ReadToString(string path)
 2         {
 3             try
 4             {
 5                 LogLock.EnterReadLock();
 6                 StreamReader sr = new StreamReader(path, Encoding.Default);
 7                 StringBuilder sb = new StringBuilder();
 8                 string line;
 9                 while ((line = sr.ReadLine()) != null)
10                 {
11                     sb.AppendLine(line.ToString());
12                 }
13                 sr.Close();
14                 sr.Dispose();
15                 return sb.ToString();
16             }
17             catch (IOException e)
18             {
19                 Console.WriteLine(e.ToString());
20                 return null;
21             }
22             finally
23             {
24                 LogLock.ExitReadLock();
25             }
26         }

实现解析:

(1.为防止任务读取当我们进行读取时需要添加读取锁保证可以依次读取,否则可能出现被占用异常。

(2.创建读取流StreamReader,依次读取每一行。

(3.读取完成释放资源。并解锁。

2.写入文本文件方法

(1.创建文本并写入

使用:JIYUWU.TXT.TXTHelper.CreateWrite(“文件物理路径”,“文本内容”)

 1 public static bool CreateWrite(string path, string context)
 2         {
 3             bool b = false;
 4             try
 5             {
 6                 LogLock.EnterWriteLock();
 7                 FileStream fs = new FileStream(path, FileMode.Create);
 8                 //获得字节数组
 9                 byte[] data = System.Text.Encoding.Default.GetBytes(context);
10                 //开始写入
11                 fs.Write(data, 0, data.Length);
12                 //清空缓冲区、关闭流
13                 fs.Flush();
14                 fs.Close();
15                 return b;
16             }
17             catch (Exception ex)
18             {
19                 Console.WriteLine(ex.ToString());
20                 return b;
21             }
22             finally
23             {
24                 LogLock.ExitWriteLock();
25             }
26         }

(2.在文本文件末尾追加写入

使用:JIYUWU.TXT.TXTHelper.WriteAppend(“文件物理路径”,“文本内容”)

 1 public static bool WriteAppend(string path, string context)
 2         {
 3             bool b = false;
 4             try
 5             {
 6                 LogLock.EnterWriteLock();
 7                 FileStream fs = new FileStream(path, FileMode.Append);
 8                 StreamWriter sw = new StreamWriter(fs);
 9                 //开始写入
10                 sw.Write(context);
11                 //清空缓冲区
12                 sw.Flush();
13                 //关闭流
14                 sw.Close();
15                 fs.Close();
16                 return b;
17             }
18             catch (Exception ex)
19             {
20                 Console.WriteLine(ex.ToString());
21                 return b;
22             }
23             finally
24             {
25                 LogLock.ExitWriteLock();
26             }
27         }

(3.自动判断换行追加或创建文本

使用:JIYUWU.TXT.TXTHelper.CreateOrWriteAppendLine(“文件物理路径”,“文本内容”)

 1 public static bool CreateOrWriteAppendLine(string path, string context)
 2         {
 3             bool b = false;
 4             try
 5             {
 6                 LogLock.EnterWriteLock();
 7                 if (!File.Exists(path))
 8                 {
 9                     FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
10                     StreamWriter sw = new StreamWriter(fs);
11                     long fl = fs.Length;
12                     fs.Seek(fl, SeekOrigin.End);
13                     sw.WriteLine(context);
14                     sw.Flush();
15                     sw.Close();
16                     fs.Close();
17                     b = true;
18                 }
19                 else
20                 {
21                     FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write);
22                     StreamWriter sw = new StreamWriter(fs);
23                     long fl = fs.Length;
24                     fs.Seek(fl, SeekOrigin.Begin);
25                     sw.WriteLine(context);
26                     sw.Flush();
27                     sw.Close();
28                     fs.Close();
29                     b = true;
30                 }
31                 return b;
32             }
33             catch (Exception ex)
34             {
35                 Console.WriteLine(ex.ToString());
36                 return b;
37             }
38             finally
39             {
40                 LogLock.ExitWriteLock();
41             }
42         }

实现解析:

(1)为防止多任务读取当我们进行读取时需要添加读取锁保证可以依次写入,否则可能出现被占用异常。

(2)创建文本流FileStream及写入流StreamWriter,直接进行数据写入。

(3)读取完成释放资源。并解锁。

3.写入日志

使用:JIYUWU.TXT.TXTHelper.WriteLog(“文本内容”,“单个文件大小(选填默认1M)”,“目录下文件数量(选填默认20个)”,“输出目录(选填默认bin文件下)”)

 1 public static void WriteLog(string content, int fileSize = 1, int fileCount = 20, string filePath = "")
 2         {
 3             try
 4             {
 5                 if (!string.IsNullOrWhiteSpace(filePath))
 6                 {
 7                     logPath = filePath;
 8                 }
 9                 LogLock.EnterWriteLock();
10                 logPath = logPath.Replace("file:\\", "");//这里为了兼容webapi的情况
11                 string dataString = DateTime.Now.ToString("yyyy-MM-dd");
12                 string path = logPath + "\\MyLog";
13                 if (!Directory.Exists(path))
14                 {
15                     Directory.CreateDirectory(path);
16                     path += "\\";
17                     path += DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
18                     FileStream fs = new FileStream(path, FileMode.Create);
19                     fs.Close();
20                 }
21                 else
22                 {
23                     int x = System.IO.Directory.GetFiles(path).Count();
24                     path += "\\";
25                     Dictionary<string, DateTime> fileCreateDate = new Dictionary<string, DateTime>();
26                     string[] filePathArr = Directory.GetFiles(path, "*.txt", SearchOption.TopDirectoryOnly);
27                     if (filePathArr.Length == 0)
28                     {
29                         string sourceFilePath = path;
30                         path += DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
31                         FileStream fs = new FileStream(path, FileMode.Create);
32                         fs.Close();
33                         filePathArr = Directory.GetFiles(sourceFilePath, "*.txt", SearchOption.TopDirectoryOnly);
34                     }
35                     for (int i = 0; i < filePathArr.Length; i++)
36                     {
37                         FileInfo fi = new FileInfo(filePathArr[i]);
38                         fileCreateDate[filePathArr[i]] = fi.CreationTime;
39                     }
40                     fileCreateDate = fileCreateDate.OrderBy(f => f.Value).ToDictionary(f => f.Key, f => f.Value);
41                     FileInfo fileInfo = new FileInfo(fileCreateDate.Last().Key);
42                     if (fileInfo.Length < 1024 * 1024 * fileSize)
43                     {
44                         path = fileCreateDate.Last().Key;
45                     }
46                     else
47                     {
48                         path += DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
49                         FileStream fs = new FileStream(path, FileMode.Create);
50                         fs.Close();
51                     }
52                     if (x > fileCount)
53                     {
54                         File.Delete(fileCreateDate.First().Key);
55                     }
56
57                 }
58                 FileStream fs2 = new FileStream(path, FileMode.Open, FileAccess.Write);
59                 StreamWriter sw = new StreamWriter(fs2);
60                 long fl = fs2.Length;
61                 fs2.Seek(fl, SeekOrigin.Begin);
62                 sw.WriteLine(DateTime.Now.ToString("hh:mm:ss") + "---> " + content);
63                 sw.Flush();
64                 sw.Close();
65                 fs2.Close();
66             }
67             catch (Exception ex)
68             {
69                 Console.WriteLine(ex.ToString());
70             }
71             finally
72             {
73                 LogLock.ExitWriteLock();
74             }
75
76         }

实现解析(以全部默认参数为例说明):

(1.为防止多任务进行操作,于是对文档加一个写入锁,否则可能出现被占用异常。

(2.检测文件目录是否已存在,不存在则创建目录并创建日志文件,存在就判断文件数量和大小,文件大小超过设置的值或默认值就新建一个文本,文件数量超过默认值或设置值就删除最早的一个文件。

(3.写入到指定文件。

(4.完成释放资源。并解锁。

项目框架就介绍到这里吧,后期还会将功能扩展,不多说了源码地址:

https://download.csdn.net/download/silverbutter/10569972

原文地址:https://www.cnblogs.com/jiyuwu/p/9383193.html

时间: 2024-11-10 16:51:54

打造一个简单的TXT文本操作及日志框架的相关文章

[.NET] 一步步打造一个简单的 MVC 网站 - BooksStore

一步步打造一个简单的 MVC 网站 - BooksStore 简介 主要功能与知识点如下: 分类.产品浏览.购物车.结算.CRUD(增删改查) 管理.分页和单元测试. [备注]项目使用 VS2015 + C#6 进行开发. 一.创建项目架构 1.新建一个解决方案“BooksStore”,并添加以下项目: BooksStore.Domain:类库,存放域模型和逻辑,使用 EF: BooksStore.WebUI:Web 应用程序,存放视图和控制器,充当显示层: BoosStore.UnitTest

[.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(二)

一步步打造一个简单的 MVC 电商网站 - BooksStore(二) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 前:<一步步打造一个简单的 MVC 电商网站 - BooksStore(一)> 简介 上一次我们尝试了:创建项目架构.创建域模型实体.创建单元测试.创建控制器与视图.创建分页和加入样式,而这一节我们会完成两个功能,分类导航与购物车. 主要功能与知识点如下: 分类.产品浏览.购物车.结算.CRUD(增删

[.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(四)

一步步打造一个简单的 MVC 电商网站 - BooksStore(四) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore <一步步打造一个简单的 MVC 电商网站 - BooksStore(一)>(发布时间:2017-03-30 ) <一步步打造一个简单的 MVC 电商网站 - BooksStore(二)>(发布时间:2017-03-31) <一步步打造一个简单的 MVC 电商网站 - BooksSto

用php实现一个简单的链式操作

最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen(trim($str)); 那么能否实现下面这种写法呢? $str->trim()->strlen(); 下面就来试下. 链式操作,说白了其实就是链式的调用对象的方法.既然要实现字符串的链式操作,那么就要实现一个字符串类,然后对这个类的对象进行调用操作.我对字符串类的期望如下:(1)当我创建对象时,

一个简单的NetCore项目:1 - 搭建框架,生成数据库

1- 启动项目 安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了.简单粗暴的方式就是安装最新的VS2015. 2-搭建框架 2.1 打开VS新建一个项目,在弹出的新建项目对话框中,选中NET CORE选项,右边出现的选项就是.NET CORE的所有可建项目了.然后和创建传统.NET项目一样的创建项目就行了. PS:不理解的可以参考 园子里面翻译小组的文章 2.2 开始编写领域实体对象.这里是先实现一个简单的权限管理.所以现在GR.Core 类库中创建一个domain文件夹,然

【造轮子】打造一个简单的万能Excel读写工具

大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式操作?来~,喜欢用lambda(虽然java的比较蛋疼~),来~看这个~ 哈哈,如果你用的不是java8~~没问题,那就默默地用老方式匿名类来实现这些功能吧,但是这并不妨碍您的使用哈哈~~~ 更新多次~希望大家也能够集思广益~ github地址:https://github.com/MatrixSe

ASP.NET Core 打造一个简单的图书馆管理系统(三)基本登录页面以及授权逻辑的建立

前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows <Pro ASP.NET MVC 5>.<Bootstrap 开发精解>.<锋利的 jQuery> 此系列皆使用 VS2017+C# 作为开发环境.

一个简单的数组类操作

要求定义一个数组类,动态分配数组大小,并实现反转与排序操作. 代码如下: class Array { private int a[] = null; private int foot=0; public Array(int len) { if (len > 0) this.a = new int[len]; else this.a = new int[1]; } public boolean add(int i){ if(this.foot<this.a.length){ this.a[foo

[bootstrap] 打造一个简单的系统模板(1) 左侧折叠菜单

1. 前言 最近需要做一个后台管理系统,我打算使用bootstrap弄一个好看的后台模板.网上的好多模板我觉的css和js有点重. 于是就打算完全依靠bootstrap搭建一个属于自己的模板. 首先从左侧的折叠菜单开始.看图. 2. CSS 代码 以下是自定义的css代码,由于系统是内部使用,所以优先考虑chrome,firefox 不考虑IE了. #main-nav { margin-left: 1px; } #main-nav.nav-tabs.nav-stacked > li > a {