C#自动清理图片的系统用设计模式实现

该文章介绍了一个利用观察者模式设计的系统,该系统监控指定目录下的图片文件,当图片超过特定时间未被访问则自动删除,并通过IImageObserver接口通知观察者进行清理。ImageManager类作为被观察者,启动监控线程,ImageCleaner类作为具体观察者处理删除事件。
摘要由CSDN通过智能技术生成

假设我们需要开发一个自动清理图片的系统,其功能是监控指定目录下的图片文件,当图片文件超过一定的时间没有被访问时,就会自动删除这些图片文件。我们可以使用观察者模式来实现这个系统。

首先,我们需要定义一个观察者接口IImageObserver,用于通知需要清理的图片文件。具体实现如下:

public interface IImageObserver
{
    void OnImageAccessed(string imagePath);
}

然后,我们需要定义一个被观察者类ImageManager,用于监控指定目录下的图片文件。具体实现如下:

public class ImageManager
{
    private readonly List<IImageObserver> _observers = new List<IImageObserver>();
    private readonly string _directoryPath;
    private readonly int _expireSeconds;

    public ImageManager(string directoryPath, int expireSeconds)
    {
        _directoryPath = directoryPath;
        _expireSeconds = expireSeconds;

        // 在构造函数中启动监控线程
        Thread thread = new Thread(MonitorDirectory);
        thread.IsBackground = true;
        thread.Start();
    }

    public void Attach(IImageObserver observer)
    {
        _observers.Add(observer);
    }

    public void Detach(IImageObserver observer)
    {
        _observers.Remove(observer);
    }

    private void MonitorDirectory()
    {
        while (true)
        {
            try
            {
                DirectoryInfo directory = new DirectoryInfo(_directoryPath);
                if (!directory.Exists)
                    return;

                foreach (var file in directory.GetFiles())
                {
                    if (file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png")
                    {
                        DateTime lastAccessTime = file.LastAccessTime;
                        TimeSpan timeSpan = DateTime.Now - lastAccessTime;
                        if (timeSpan.TotalSeconds > _expireSeconds)
                        {
                            file.Delete();
                            NotifyObservers(file.FullName);
                        }
                    }
                }
            }
            catch
            {
                // 忽略异常,继续监控
            }

            // 每隔一定时间扫描一次目录
            Thread.Sleep(1000);
        }
    }

    private void NotifyObservers(string imagePath)
    {
        foreach (var observer in _observers)
        {
            observer.OnImageAccessed(imagePath);
        }
    }
}

在ImageManager类中,我们维护了一个观察者列表_observers,并在构造函数中启动了一个监控线程MonitorDirectory,用于扫描指定目录下的图片文件。当图片文件超过一定的时间没有被访问时,我们会删除这些图片文件,并调用NotifyObservers方法通知所有的观察者。

最后,我们可以定义一个具体的观察者类ImageCleaner,用于清理被删除的图片文件。具体实现如下:

public class ImageCleaner : IImageObserver
{
    public void OnImageAccessed(string imagePath)
    {
        Console.WriteLine($"Image file {imagePath} has been deleted.");
    }
}

在这个具体的观察者类中,我们实现了OnImageAccessed方法,当被观察到需要清理的图片文件时,会打印出相应的日志信息。

最终,我们可以在主函数中使用这些类来实现自动清理图片的系统。具体实现如下:

static void Main(string[] args)
{
    ImageManager imageManager = new ImageManager(@"C:\Images", 3600);
    ImageCleaner imageCleaner = new ImageCleaner();
    imageManager.Attach(imageCleaner);

    Console.ReadKey();
}

在主函数中,我们创建了一个ImageManager对象,用于监控指定目录下的图片文件。我们还创建了一个ImageCleaner对象,并将其注册为ImageManager的观察者。这样,当ImageManager删除图片文件时,ImageCleaner会自动清理这些被删除的图片文件,并打印出相应的日志信息。

以上就是使用观察者模式来实现自动清理图片的系统的一个简单例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值