C#實(shí)現(xiàn)一個簡單實(shí)用的TXT文本操作及日志框架詳解
前言
首先先介紹一下這個項(xiàng)目,該項(xiàng)目實(shí)現(xiàn)了文本寫入及讀取,日志寫入指定文件夾或默認(rè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();
}
}
實(shí)現(xiàn)解析:
(1.為防止任務(wù)讀取當(dāng)我們進(jìn)行讀取時需要添加讀取鎖保證可以依次讀取,否則可能出現(xiàn)被占用異常。
(2.創(chuàng)建讀取流StreamReader(注意:由于會出現(xiàn)亂碼這里要改一下把默認(rè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();
}
}
實(shí)現(xiàn)解析:
(1)為防止多任務(wù)讀取當(dāng)我們進(jìn)行讀取時需要添加讀取鎖保證可以依次寫入,否則可能出現(xiàn)被占用異常。
(2)創(chuàng)建文本流FileStream及寫入流StreamWriter,直接進(jìn)行數(shù)據(jù)寫入。
(3)讀取完成釋放資源。并解鎖。
3.寫入日志
使用:JIYUWU.TXT.TXTHelper.WriteLog(“文本內(nèi)容”,“單個文件大小(選填默認(rèn)1M)”,“目錄下文件數(shù)量(選填默認(rèn)20個)”,“輸出目錄(選填默認(rèn)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();
}
}
實(shí)現(xiàn)解析(以全部默認(rèn)參數(shù)為例說明):
(1.為防止多任務(wù)進(jìn)行操作,于是對文檔加一個寫入鎖,否則可能出現(xiàn)被占用異常。
(2.檢測文件目錄是否已存在,不存在則創(chuàng)建目錄并創(chuàng)建日志文件,存在就判斷文件數(shù)量和大小,文件大小超過設(shè)置的值或默認(rèn)值就新建一個文本,文件數(shù)量超過默認(rèn)值或設(shè)置值就刪除最早的一個文件。
(3.寫入到指定文件。
(4.完成釋放資源。并解鎖。
項(xiàng)目框架就介紹到這里吧,后期還會將功能擴(kuò)展,不多說了源碼地址:
http://xiazai.jb51.net/201807/yuanma/c-txt-log_jb51.rar (可能存在沒有測到的bug,出現(xiàn)的問題可以反饋給我,謝謝您的支持)。
問題匯總:
bug1:程序包中讀取txt可能出現(xiàn)亂碼,讀取流中改一下把默認(rèn)改為Encoding.UTF8應(yīng)該就可以了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
C#中IDispose接口的實(shí)現(xiàn)及為何這么實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于C#中IDispose接口的實(shí)現(xiàn)及為何這么實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
C#中通過使用Connection類來實(shí)現(xiàn)打開/關(guān)閉數(shù)據(jù)庫的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于C#中通過使用Connection類來實(shí)現(xiàn)打開/關(guān)閉數(shù)據(jù)庫的代碼實(shí)例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
C#遞歸應(yīng)用之實(shí)現(xiàn)JS文件的自動引用
這篇文章主要為大家詳細(xì)介紹了C#如何利用遞歸實(shí)現(xiàn)JS文件的自動引用的功能,文中的示例代碼講解詳細(xì),具有一定的參考價值,需要的可以參考一下2023-03-03

