Files
thinkyu/branches/1150807/Common/WDeleteFileService.cs
T
sryang 577060bc78 chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
2026-09-10 09:42:37 +08:00

174 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Timers;
using System.IO;
namespace Wellan.Service
{
/// <summary>
/// 檔案定時清除服務
/// </summary>
public class WDeleteFileService
{
private WDeleteFileService()
{
_deleteFilePatterns = new List<string>();
_timer = new Timer();
_timer.Enabled = false;
_timer.Elapsed += new ElapsedEventHandler(DoDeleteFile);
}
public static WDeleteFileService GetInstance()
{
if (_instance == null)
_instance = new WDeleteFileService();
return _instance;
}
/// <summary>
/// 檔案刪除間隔時間,單位為秒。預設值為 600 秒
/// </summary>
public int Interval
{
get
{
return _interval;
}
set
{
_interval = value;
}
}
/// <summary>
/// 要刪除多久之前的檔案,單位為秒。預設值為 600 秒
/// </summary>
public int FileAgeToDelete
{
get
{
return Convert.ToInt32(_fileAge.TotalSeconds);
}
set
{
_fileAge = new TimeSpan(value * TimeSpan.TicksPerSecond);
}
}
/// <summary>
/// 設定或取得檔案定時清除服務是否啟動
/// </summary>
public bool Enabled
{
get
{
return _enabled;
}
set
{
if (value)
{
if (_enabled)
return;
_timer.Interval = _interval * 1000;
_timer.AutoReset = true;
_timer.Enabled = true;
_enabled = true;
}
else
{
if (!_enabled)
return;
_enabled = false;
_timer.Enabled = false;
}
}
}
/// <summary>
/// <para>欲清除的檔案路徑及檔案名稱,檔案名稱可以使用萬用字元</para>
/// <para>需要多個檔案路徑及檔案名稱時,請將所需的檔案路徑及檔案名稱一一加入</para>
/// <para>例如:c:\temp\*.mdb 表示要清除 c:\temp 目錄下的 *.mdb</para>
/// </summary>
public List<string> DeletePatterns
{
get
{
return _deleteFilePatterns;
}
}
/// <summary>
/// 實際執行刪除的動作
/// </summary>
private void DoDeleteFile(object sender, ElapsedEventArgs e)
{
if (!_enabled)
{
_timer.Enabled = false;
return;
}
_timer.Enabled = false;
try
{
foreach (string pattern in _deleteFilePatterns)
{
string namepart = Path.GetFileName(pattern);
string pathPart = pattern.Substring(0, pattern.Length - namepart.Length);
try
{
DirectoryInfo dirInfo = new DirectoryInfo(pathPart);
FileInfo[] matchFiles = dirInfo.GetFiles(namepart);
foreach (FileInfo file in matchFiles)
{
try
{
if (DateTime.Now - file.LastWriteTime > _fileAge)
file.Delete();
}
catch
{
// do nothing
}
}
}
catch
{
// do nothing
}
}
}
finally
{
_timer.Enabled = true;
}
}
private static WDeleteFileService _instance = null;
private List<string> _deleteFilePatterns = null;
private Timer _timer = null;
private int _interval = 600;
private TimeSpan _fileAge = new TimeSpan(TimeSpan.TicksPerSecond * 600);
private bool _enabled = false;
#region UNIT TEST
public static void Main()
{
WDeleteFileService delSrv = WDeleteFileService.GetInstance();
delSrv.DeletePatterns.Add(@"c:\temp\*.*");
delSrv.Interval = 5;
delSrv.FileAgeToDelete = 1;
delSrv.Enabled = true;
Console.WriteLine("Press ENTER to end program");
Console.ReadLine();
delSrv.Enabled = false;
}
#endregion
}
}