C# 自動備份和清理日誌文件

//日誌備份,自動清理功能
        static List<string> listFile = new List<string>();

        public static void ZipLog()
        {
            //   Create   a   new   Timer   with   Interval   set   to   10   seconds.   
            Timer aTimer = new Timer(1000);
            aTimer.Elapsed += new ElapsedEventHandler(RunZip);
            //   Only   raise   the   event   the   first   time   Interval   elapses.   
            aTimer.AutoReset = true;
            aTimer.Enabled = true;

            Console.WriteLine("The Task Is Running... write 'q' exit");
            while (Console.Read() != 'q') ;
        }

        /// <summary>
        /// 遍歷文件夾將所有文件進行壓縮
        /// </summary>
        private static void RunZip(object source, ElapsedEventArgs e)
        {
            //存放日誌文件的目錄
            string filePath = @"D:\log\";

            DateTime formatDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
             //指定的備份時間(例如:當天下午2點1分1秒 時開始執行備份操作)
            DateTime startTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 14:01:01"));
            Console.WriteLine(formatDate+" "+startTime);
            //定時執行時間判斷
            double ts = (formatDate - startTime).TotalSeconds;
            if (ts == 0)
          {
                GetAllFiles(filePath);
                foreach (string file in listFile)
                {
                    Console.WriteLine(DateTime.Now + "-=|備份:" + file);
                    ZipFile(file);
                }
                Console.WriteLine(DateTime.Now + "任務結束");
            }
        }

        /// <summary>
        /// 遍歷目錄下所有文件
        /// </summary>
        /// <param name="filePath"></param>
        private static void GetAllFiles(string filePath)
        {
            if (!System.IO.File.Exists("D:\\log\\log.txt"))
            {
                System.IO.FileStream f = System.IO.File.Create("D:\\log\\log.txt");
                f.Close();
            }
            //遞歸遍歷所有子文件夾
            string[] dir = Directory.GetDirectories(filePath);
            for (int n = 0; n < dir.Length; n++)
            {
                GetAllFiles(dir[n]);
            }

            //保存文件夾內的文件路徑 log文件
            string[] file = Directory.GetFiles(filePath, "*.txt");
            for (int i = 0; i < file.Length; i++)
            {
                FileInfo fi = new FileInfo(file[i]);
                //將兩天前的日誌加入壓縮文件列表
                //if (fi.LastWriteTime < DateTime.Now.AddDays(-2))
                if (fi.LastWriteTime < DateTime.Now.AddMinutes(-5))
                {

                    listFile.Add(file[i]);
                }


            }

            //刪除指定時間前的備份文件 rar文件
            string[] fileRar = Directory.GetFiles(filePath, "*.rar");
            for (int i = 0; i < fileRar.Length; i++)
            {
                FileInfo fi = new FileInfo(fileRar[i]);

                //if (fi.LastWriteTime < DateTime.Now.AddDays(-25))//25天前
                if (fi.LastWriteTime < DateTime.Now.AddMinutes(-10))//10分鐘前
                {
                    Console.WriteLine(DateTime.Now + "-=|刪除:" + fileRar[i]);
                    fi.Delete();

                }


            }
        }

        /// <summary>
        /// 根據文件路徑壓縮[刪除源文件(-df);不包含文件路徑(-ep)]
        /// </summary>
        /// <param name="str">文件路徑</param>
        /// <returns></returns>
        private static string ZipFile(string strFileName)
        {
            string fullFileName = strFileName;

            System.IO.FileInfo fi = new System.IO.FileInfo(fullFileName);

            string FileName = @"C:\Program Files\WinRAR\WinRAR.exe";   //Winrar軟件的安裝目錄,也可以將'rar.exe'放在程序的運行目錄,不過需要更改一下路徑
            //執行壓縮的命令,可以查看winrar軟件的幫助文檔,裏面有詳細的說明,備份文件名已當前時間戳命名
            string command = "-df -ep -tl -or a " + fi.Directory + @"\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".rar " + fullFileName;

            System.Diagnostics.Process p = new System.Diagnostics.Process();
            string ResultStr;
            p.StartInfo.FileName = FileName;
            p.StartInfo.Arguments = " " + command;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.ErrorDialog = false;
            p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            try
            {
                p.Start();
                ResultStr = p.StandardError.ReadToEnd();
                p.Close();
                return ResultStr;
            }
            catch (Exception ex)
            {
                return ex.Message.ToString();
            }
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章