C#實現(xiàn)一個簡單實用的TXT文本操作及日志框架詳解
前言
首先先介紹一下這個項目,該項目實現(xiàn)了文本寫入及讀取,日志寫入指定文件夾或默認文件夾,日志數(shù)量控制,單個日志大小控制,通過約定的參數(shù)讓用戶可以用更少的代碼解決問題。
1.讀取文本文件方法
使用:JIYUWU.TXT.TXTHelper.ReadToString(“文件物理路徑”)
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();
}
}
實現(xiàn)解析:
(1.為防止任務(wù)讀取當我們進行讀取時需要添加讀取鎖保證可以依次讀取,否則可能出現(xiàn)被占用異常。
(2.創(chuàng)建讀取流StreamReader(注意:由于會出現(xiàn)亂碼這里要改一下把默認改為Encoding.UTF8),依次讀取每一行。
(3.讀取完成釋放資源。并解鎖。
2.寫入文本文件方法
(1.創(chuàng)建文本并寫入
使用:JIYUWU.TXT.TXTHelper.CreateWrite(“文件物理路徑”,“文本內(nèi)容”)
public static bool CreateWrite(string path, string context)
{
bool b = false;
try
{
LogLock.EnterWriteLock();
FileStream fs = new FileStream(path, FileMode.Create);
//獲得字節(jié)數(shù)組
byte[] data = System.Text.Encoding.Default.GetBytes(context);
//開始寫入
fs.Write(data, 0, data.Length);
//清空緩沖區(qū)、關(guān)閉流
fs.Flush();
fs.Close();
return b;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return b;
}
finally
{
LogLock.ExitWriteLock();
}
}
(2.在文本文件末尾追加寫入
使用:JIYUWU.TXT.TXTHelper.WriteAppend(“文件物理路徑”,“文本內(nèi)容”)
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);
//清空緩沖區(qū)
sw.Flush();
//關(guān)閉流
sw.Close();
fs.Close();
return b;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return b;
}
finally
{
LogLock.ExitWriteLock();
}
}
(3.自動判斷換行追加或創(chuàng)建文本
使用:JIYUWU.TXT.TXTHelper.CreateOrWriteAppendLine(“文件物理路徑”,“文本內(nèi)容”)
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();
}
}
實現(xiàn)解析:
(1)為防止多任務(wù)讀取當我們進行讀取時需要添加讀取鎖保證可以依次寫入,否則可能出現(xiàn)被占用異常。
(2)創(chuàng)建文本流FileStream及寫入流StreamWriter,直接進行數(shù)據(jù)寫入。
(3)讀取完成釋放資源。并解鎖。
3.寫入日志
使用:JIYUWU.TXT.TXTHelper.WriteLog(“文本內(nèi)容”,“單個文件大?。ㄟx填默認1M)”,“目錄下文件數(shù)量(選填默認20個)”,“輸出目錄(選填默認bin文件下)”)
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();
}
}
實現(xiàn)解析(以全部默認參數(shù)為例說明):
(1.為防止多任務(wù)進行操作,于是對文檔加一個寫入鎖,否則可能出現(xiàn)被占用異常。
(2.檢測文件目錄是否已存在,不存在則創(chuàng)建目錄并創(chuàng)建日志文件,存在就判斷文件數(shù)量和大小,文件大小超過設(shè)置的值或默認值就新建一個文本,文件數(shù)量超過默認值或設(shè)置值就刪除最早的一個文件。
(3.寫入到指定文件。
(4.完成釋放資源。并解鎖。
項目框架就介紹到這里吧,后期還會將功能擴展,不多說了源碼地址:
http://xiazai.jb51.net/201807/yuanma/c-txt-log_jb51.rar (可能存在沒有測到的bug,出現(xiàn)的問題可以反饋給我,謝謝您的支持)。
問題匯總:
bug1:程序包中讀取txt可能出現(xiàn)亂碼,讀取流中改一下把默認改為Encoding.UTF8應(yīng)該就可以了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
DevExpress實現(xiàn)GridControl列頭繪制Checkbox的方法
這篇文章主要介紹了DevExpress實現(xiàn)GridControl列頭繪制Checkbox的方法,需要的朋友可以參考下2014-08-08

