打造一個簡單實用的的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
更多相關文章
  • 有時候,可能會有一些類似這樣的需求,具體如圖所見,取首字母。 ...
  • 前言 Spring框架為什麼如此流行? 原來Spring框架解決了一個很關鍵的問題,它可以把對象之間的依賴關係轉為用配置文件來管理,也就是它的依賴註入機制。IOC容器用來管理這些Bean,管理Bean的關係以及生命周期,然而這與之前將應用程式主動new對象不同,Spring實現使用IOC容器創建對象 ...
  • 接著 上篇 目前也算是交代清楚了相關的類。那麼框架具體是如何來實例化的呢?整個的流程是怎麼樣的。 我們參考源碼中的Test文件夾來看看: var collection = new ServiceCollection(); collection.AddTransient<DependOnNonexis ...
  • 本文主要以一個簡單的小例子,描述C# Winform程式異常關閉時,如何進行捕獲,並記錄日誌。 ...
  • 誤解一:併發就是多線程 實際上多線程只是併發編程的一種形式,在C 中還有很多更實用、更方便的併發編程技術,包括非同步編程、並行編程、TPL 數據流、響應式編程等。 誤解二:只有大型伺服器程式才需要考慮併發 伺服器端的大型程式要響應大量客戶端的數據請求,當然要充分考慮併發。但是桌面程式和手機、平板等移動 ...
  • 1. 程式集和CIL: 程式集是由.NET語言的編譯器接受源代碼文件產生的輸出文件,通常分為 exe和dll兩類,其中exe包含Main入口方法可以雙擊執行,dll則需要被其他程式集調用執行。 CIL(Common Intermediate Language): 公共中間語言①,需要被編譯成二進位機 ...
  • 依賴註入(DI)不是一個新的話題,它的出現是伴隨著系統解耦的需要而幾乎必然產生的。 在SOLID設計原則中,DIP(Dependency inversion principle)——依賴倒置,規定了“需依賴抽象,而非實現”的準則,該原則主要目的是通過引入抽象(比如介面)的方式降低模塊之間的耦合性。與 ...
  • 轉載請註明出處: https://home.cnblogs.com/u/zhiyong-ITNote/ 常用擴展方法 註入依賴服務: new ServiceCollection().AddSingleton<IApplicationBuilder, ApplicationBuilder>(); // ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...