前言
首先先介紹一下這個項目,該項目實現了文本寫入及讀取,日志寫入指定文件夾或默認文件夾,日志數量控制,單個日志大小控制,通過約定的參數讓用戶可以用更少的代碼解決問題。
1.讀取文本文件方法
使用:JIYUWU.TXT.TXTHelper.ReadToString(“文件物理路徑”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public static string ReadToString( string path) { try { LogLock.EnterReadLock(); StreamReader sr = new StreamReader(path, Encoding.UTF8); StringBuilder sb = new StringBuilder(); string line; while ((line = sr.ReadLine()) != null ) { sb.AppendLine(line.ToString()); } sr.Close(); sr.Dispose(); return sb.ToString(); } catch (IOException e) { Console.WriteLine(e.ToString()); return null ; } finally { LogLock.ExitReadLock(); } } |
實現解析:
(1.為防止任務讀取當我們進行讀取時需要添加讀取鎖保證可以依次讀取,否則可能出現被占用異常。
(2.創建讀取流StreamReader(注意:由于會出現亂碼這里要改一下把默認改為Encoding.UTF8),依次讀取每一行。
(3.讀取完成釋放資源。并解鎖。
2.寫入文本文件方法
(1.創建文本并寫入
使用:JIYUWU.TXT.TXTHelper.CreateWrite(“文件物理路徑”,“文本內容”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public static bool CreateWrite( string path, string context) { bool b = false ; try { LogLock.EnterWriteLock(); FileStream fs = new FileStream(path, FileMode.Create); //獲得字節數組 byte [] data = System.Text.Encoding.Default.GetBytes(context); //開始寫入 fs.Write(data, 0, data.Length); //清空緩沖區、關閉流 fs.Flush(); fs.Close(); return b; } catch (Exception ex) { Console.WriteLine(ex.ToString()); return b; } finally { LogLock.ExitWriteLock(); } } |
(2.在文本文件末尾追加寫入
使用:JIYUWU.TXT.TXTHelper.WriteAppend(“文件物理路徑”,“文本內容”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public static bool WriteAppend( string path, string context) { bool b = false ; try { LogLock.EnterWriteLock(); FileStream fs = new FileStream(path, FileMode.Append); StreamWriter sw = new StreamWriter(fs); //開始寫入 sw.Write(context); //清空緩沖區 sw.Flush(); //關閉流 sw.Close(); fs.Close(); return b; } catch (Exception ex) { Console.WriteLine(ex.ToString()); return b; } finally { LogLock.ExitWriteLock(); } } |
(3.自動判斷換行追加或創建文本
使用:JIYUWU.TXT.TXTHelper.CreateOrWriteAppendLine(“文件物理路徑”,“文本內容”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public static bool CreateOrWriteAppendLine( string path, string context) { bool b = false ; try { LogLock.EnterWriteLock(); if (!File.Exists(path)) { FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); long fl = fs.Length; fs.Seek(fl, SeekOrigin.End); sw.WriteLine(context); sw.Flush(); sw.Close(); fs.Close(); b = true ; } else { FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); long fl = fs.Length; fs.Seek(fl, SeekOrigin.Begin); sw.WriteLine(context); sw.Flush(); sw.Close(); fs.Close(); b = true ; } return b; } catch (Exception ex) { Console.WriteLine(ex.ToString()); return b; } finally { LogLock.ExitWriteLock(); } } |
實現解析:
(1)為防止多任務讀取當我們進行讀取時需要添加讀取鎖保證可以依次寫入,否則可能出現被占用異常。
(2)創建文本流FileStream及寫入流StreamWriter,直接進行數據寫入。
(3)讀取完成釋放資源。并解鎖。
3.寫入日志
使用:JIYUWU.TXT.TXTHelper.WriteLog(“文本內容”,“單個文件大?。ㄟx填默認1M)”,“目錄下文件數量(選填默認20個)”,“輸出目錄(選填默認bin文件下)”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
public static void WriteLog( string content, int fileSize = 1, int fileCount = 20, string filePath = "" ) { try { if (! string .IsNullOrWhiteSpace(filePath)) { logPath = filePath; } LogLock.EnterWriteLock(); logPath = logPath.Replace( "file:\\" , "" ); //這里為了兼容webapi的情況 string dataString = DateTime.Now.ToString( "yyyy-MM-dd" ); string path = logPath + "\\MyLog" ; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); path += "\\" ; path += DateTime.Now.ToString( "yyyy-MM-dd" ) + ".txt" ; FileStream fs = new FileStream(path, FileMode.Create); fs.Close(); } else { int x = System.IO.Directory.GetFiles(path).Count(); path += "\\" ; Dictionary< string , DateTime> fileCreateDate = new Dictionary< string , DateTime>(); string [] filePathArr = Directory.GetFiles(path, "*.txt" , SearchOption.TopDirectoryOnly); if (filePathArr.Length == 0) { string sourceFilePath = path; path += DateTime.Now.ToString( "yyyy-MM-dd" ) + ".txt" ; FileStream fs = new FileStream(path, FileMode.Create); fs.Close(); filePathArr = Directory.GetFiles(sourceFilePath, "*.txt" , SearchOption.TopDirectoryOnly); } for ( int i = 0; i < filePathArr.Length; i++) { FileInfo fi = new FileInfo(filePathArr[i]); fileCreateDate[filePathArr[i]] = fi.CreationTime; } fileCreateDate = fileCreateDate.OrderBy(f => f.Value).ToDictionary(f => f.Key, f => f.Value); FileInfo fileInfo = new FileInfo(fileCreateDate.Last().Key); if (fileInfo.Length < 1024 * 1024 * fileSize) { path = fileCreateDate.Last().Key; } else { path += DateTime.Now.ToString( "yyyy-MM-dd" ) + ".txt" ; FileStream fs = new FileStream(path, FileMode.Create); fs.Close(); } if (x > fileCount) { File.Delete(fileCreateDate.First().Key); } } FileStream fs2 = new FileStream(path, FileMode.Open, FileAccess.Write); StreamWriter sw = new StreamWriter(fs2); long fl = fs2.Length; fs2.Seek(fl, SeekOrigin.Begin); sw.WriteLine(DateTime.Now.ToString( "hh:mm:ss" ) + "---> " + content); sw.Flush(); sw.Close(); fs2.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { LogLock.ExitWriteLock(); } } |
實現解析(以全部默認參數為例說明):
(1.為防止多任務進行操作,于是對文檔加一個寫入鎖,否則可能出現被占用異常。
(2.檢測文件目錄是否已存在,不存在則創建目錄并創建日志文件,存在就判斷文件數量和大小,文件大小超過設置的值或默認值就新建一個文本,文件數量超過默認值或設置值就刪除最早的一個文件。
(3.寫入到指定文件。
(4.完成釋放資源。并解鎖。
項目框架就介紹到這里吧,后期還會將功能擴展,不多說了源碼地址:
c-txt-log.rar (可能存在沒有測到的bug,出現的問題可以反饋給我,謝謝您的支持)。
問題匯總:
bug1:程序包中讀取txt可能出現亂碼,讀取流中改一下把默認改為Encoding.UTF8應該就可以了。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.cnblogs.com/jiyuwu/archive/2018/07/28/9383193.html