打造一個簡單的TXT文本操作及日誌框架

来源:https://www.cnblogs.com/jiyuwu/archive/2018/07/28/9383193.html
-Advertisement-
Play Games

首先先介紹一下這個項目,該項目實現了文本寫入及讀取,日誌寫入指定文件夾或預設文件夾,日誌數量控制,單個日誌大小控制,通過約定的參數讓用戶可以用更少的代碼解決問題。 1.讀取文本文件方法 使用:JIYUWU.TXT.TXTHelper.ReadToString(“文件物理路徑”) 1 public s ...


首先先介紹一下這個項目,該項目實現了文本寫入及讀取,日誌寫入指定文件夾或預設文件夾,日誌數量控制,單個日誌大小控制,通過約定的參數讓用戶可以用更少的代碼解決問題。

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.UTF8);
 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(註意:由於會出現亂碼這裡要改一下把預設改為Encoding.UTF8),依次讀取每一行。

(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 (可能存在沒有測到的bug,出現的問題可以反饋給我,謝謝您的支持)。

問題彙總:

bug1:程式包中讀取txt可能出現亂碼,讀取流中改一下把預設改為Encoding.UTF8應該就可以了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題:使用IDEA創建Maven工程時提示"...xxx/pom.xml already exists in VFS",怎麼辦? 解決:如果只是刪除工程,還會有這樣的提示。說到底,刪除工程後,還要清理IDEA的緩存。 1、在IDEA中任意打開一個工程 2、在菜單中依次找到"File > Invali ...
  • HashMap實現原理 HashMap的底層使用數組+鏈表/紅黑樹實現。 這表示HashMap是Node數組構成,其中Node類的實現如下,可以看出這其實就是個鏈表,鏈表的每個結點是一個映射。 HashMap的每個下標都存放了一條鏈表。 常量/變數定義 關於modCount的作用見 "這篇blog" ...
  • 本文為原創,轉載請註明出處:https://www.cnblogs.com/Tom-shushu/p/9383066.html 本篇內容主要介紹:通過Servlet,JSP,Bootstrap框架以及MySQL等知識實現一個簡單地對資料庫信息進行:增,刪,改,查,分頁的操作; <一>設計資料庫 這裡 ...
  • try:將有可能導致出現異常的語句放到try塊中,如果使用了try語句後,後面的程式必須至少要跟一個except或者finally,否則程式會報錯 except:捕獲try塊中可能出現的異常 finally:不管程式是否有無異常,都會最終執行該語句 for example as below: 結果如 ...
  • C++自定義String字元串類 實現了各種基本操作,包括重載+號實現String的拼接 findSubStr函數,也就是尋找目標串在String中的位置,用到了KMP字元串搜索演算法。 include include using namespace std; class String; class ...
  • Java編程中獲取鍵盤輸入實現方法及註意事項 1. 鍵盤輸入一個數組 package com.wen201807.sort; import java.util.Scanner; public class Main { public static void main(String[] args) { ...
  • 1>:首先在CMD命令行中輸入:fsutil resource setautoreset true c:\ 2>:然後在運行services.msc 3>:找到Windows Process Activation Service服務 啟動該服務,啟動類型:自動 4>:繼續找到World Wide W ...
  • 最近面試時很多面試官都問到了EF框架 好記性不如爛筆頭 趕緊記下來 code-first是EF框架中的一種,是使用實體類來進行資料庫表的映射,所以實體類中的欄位要規範(我認為) 比如: 如果有外鍵的話 一定要搞清楚一對多、多對一和多對多的關係 比如一個用戶對應一個用戶詳細信息可以寫成這樣: 用戶詳細 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...