昨天需要寫一個c#中刪除記得log日志文件的程序。比如,我的一個程序需要有log,我把log寫到log日志文件中,每一個月我自動建一個log文件。這個log文件是以類似"xxx04.log"命名的,其中xxx是我的項目名稱,04代表4月份log。
從log日志命名上來看,下一年的四月的log也會寫在裡面,這樣就顯得比較混亂並且log日志會非常大,所以我想下一年到4月先把"xxx04.log"這個log刪除,然後再創建一個同名(“xxx04.log”)。
先貼上代碼吧:
class RecordLog
[csharp]
{
public FileStream fs = null;
public StreamWriter sw = null;
public string Dir = @"D:\xxx";
/// <summary>
/// 讀取或者新建日志文件
/// </summary>
public RecordLog()
{
try
{
if (!Directory.Exists(Dir))// 目錄不存在,新建目錄
{
Directory.CreateDirectory(Dir);
}
DeleteFile();
//add end
fs = new FileStream(
Dir + "\\" + getFileName(),
FileMode.Create | FileMode.Append,
FileAccess.Write,
FileShare.None);
fs.Seek(0, System.IO.SeekOrigin.End);
sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
}
catch (Exception ex)
{
MessageBox.Show("Exception" + ex.Message);
if (sw != null)
{
sw.Close();
sw = null;
}
if (fs != null)
{
fs.Close();
fs = null;
}
}
}
public string getFileName()//根據不同月份,新建不同的日志文件
{
DateTime dt = DateTime.Now;
int month = dt.Month;
string strMonth = (month > 10) ? month.ToString() : "0" + month.ToString();
return "xxx"+strMonth+".log";
}
/// <summary>
/// 寫日志
/// </summary>
/// <param name="info">需要寫的日志信息</param>
public void WriteLog(string info)
{
DateTime dt = DateTime.Now;
string tmp = dt.ToString();
string tmp1 = tmp.Substring(0, tmp.IndexOf("-")+1) + "0" + tmp.Substring(tmp.IndexOf("-")+1);
string tmp2 = tmp1.Replace("-", "");
string tmp3 = tmp2.Replace(":", "");
string tempTime = tmp3.Replace(" ", "");
tempTime += "|";
sw.WriteLine("{0}{1}",tempTime,info);
}
public void CloseLog()
{
if (sw != null)
{
sw.Close();
sw = null;
}
if (fs != null)
{
fs.Close();
fs = null;
}
}
public void DeleteFile()
{
try
{
if (!File.Exists(Dir + "\\" + getFileName())) //文件不存在,直接跳過
return;
DateTime createTime = File.GetLastWriteTime(Dir + "\\" + getFileName());//獲取文件的最後修改時間,如果獲取文件的最後創建時間,會有問題
DateTime nowTime = DateTime.Now;
//刪除文件
if ((createTime.Year != nowTime.Year) && (createTime.Month == nowTime.Month))
{
File.Delete(Dir + "\\" + getFileName());
}
}
catch (System.Exception ex)
{
WriteLog("刪除日志文件:" + getFileName() + "失敗。失敗原因:"+ex.Message);
}
}
}
在剛開始做的時候,想法是根據log的創建時間,比較當前的年份和這log的年份,如果年份不相等並且月份相等,我就把這個log刪除,比較代碼如下:
if ((createTime.Year != nowTime.Year) && (createTime.Month == nowTime.Month))
這裡就出現一個怪異的現象,當我刪除這個log文件的時候,再次創建,發現這個創建文件的創建時間仍為上次刪除log的創建時間。所以我上面取文件的創建時間比較方法宣告失敗(這是我測試好久才發現的,測試了好久一直認為是寫的代碼問題)。
你可以做個試驗:在桌面上創建一個文件“1.txt”,然後刪除它(你可以嘗試刪除的時候加shift鍵),隨後再創建“1.txt”,看看這個文件的創建時間是不是和剛才刪除的文件的創建時間一樣。
這樣可以得出一個結論:在我們刪除一個文件時(我只在windows操作系統上測試),只是讓操作系統認為文件不存在,文件在磁盤上的空間被標記為空,以便再次使用,但是文件的數據沒有被移除。
如果你想真正的刪除文件,用.Net你可以參考:http://www.codeproject.com/Articles/22736/Securely-Delete-a-File-using-NET
這個實現起來類似於從磁盤中查找到此文件所在扇區位置,然後往這些扇區中寫入垃圾數據,讓原來存文件的扇區數據不完整,這樣再次創建文件的時候,只能新創建一個文件,原來存在索引的文件已經被破壞。(類似於我們使用磁盤恢復工具查找我們刪除的文件,但是有的文件已經破壞的原理)
因此,從上面的代碼中,我換了一種思路,采用文件的修改時間來實現了我的功能。
//記錄自己工作學習中的點點滴滴,希望有一天會變強大///
摘自 richerg85的專欄