程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#刪除文件遇到問題

c#刪除文件遇到問題

編輯:C#入門知識

昨天需要寫一個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的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved