Windows Temp文件删除服务

时间:2018-12-08 09:08:59

标签: c# .net filesystemwatcher temp topshelf

我已经创建了Windows服务来删除本地临时文件/文件夹,并且该服务正在运行,但不会删除文件和文件夹:-

class Program
{
    static void Main(string[] args)
    {
        var exitCode = HostFactory.Run(e =>
        {
            e.Service<DeleteTempFileService>(x =>
            {
                x.ConstructUsing(() => new DeleteTempFileService());
                x.WhenStarted(execute => execute.Start());
                x.WhenStopped(execute => execute.Stop());
            });
            e.SetServiceName("DeleteTempFileService");
            e.SetDisplayName("Delete Temp File Service ");
        });
    }
}

public class DeleteTempFileService
{
    public FileSystemWatcher _fileWatcher;       

    public bool Start()
    {
        _fileWatcher = new FileSystemWatcher(@"C:\Users\xyz\AppData\Local\Temp", "*.*");
                _fileWatcher.Deleted += TempDeletionService;
                _fileWatcher.EnableRaisingEvents = true;
                _fileWatcher.IncludeSubdirectories = true;
                return true;
    }

    private void TempDeletionService(object sender, FileSystemEventArgs watcherService)
    {               
        var dir = new DirectoryInfo(watcherService.FullPath);
        foreach(var file in Directory.GetFiles(dir.ToString()))
        {
            File.Delete(file);
        }
    }

    public bool Stop()
    {
        _fileWatcher.Dispose();
        return true;
    }
}

程序运行正常,但不会删除本地temp目录中的文件/文件夹。我尝试了其他方法,但没有帮助。

2 个答案:

答案 0 :(得分:0)

我不知道我是否真的了解你的目的。看来您只想自动删除临时文件。在这种情况下,您的方法似乎存在一些问题: 您可能误解了FileSystemWatcher? FileSystemWatcher是在文件操作后触发的,您注册了对文件删除操作的监视,但是在删除文件之后,有什么用?您可以监视FileSystemWatcher.Created操作,然后删除相应的文件/文件夹。如果您只想删除文件,我认为使用Timer或Thread计时是一个不错的选择。毕竟,除非需要实时操作,否则FileSystemWatcher的开销会很大。

说些不对劲:我建议不要使用匿名方法和其他语法糖,写传统方法,匿名方法会使人懒惰,几乎没有好处:不利于包装和隔离,不利于阅读,影响代码的结构和健壮性。 不要使用var关键字,除非它可以是惰性的,它没有帮助。 加一点糖就好,加糖太多会使人生病,现在微软和C#变得越来越怪异,C#变得“复杂”,语法变得复杂,如果完全使用它就会变得越来越怪异编写的最新语法糖和传统语法,甚至不是相同的语言,这是简洁的C#吗?当然,其他语言的语法糖节奏也很普遍,这不是一个好现象。

最后,多亏了Google翻译,我的英语听写水平比我的英语阅读水平还要差。

答案 1 :(得分:0)

首先,您的代码将永远不会删除目录,因为Directory.GetFiles仅返回文件,而不返回目录。要同时检索文件和目录,请调用Directory.GetFileSystemEntries。无论您调用哪种方法,采用单个path参数的重载都只会返回作为指定目录的直接子级的对象。如果要在后代目录中包含对象,则需要调用an overload that takes a SearchOption parameter

第二,您的DeleteTempFileService类正在做的是创建一个FileSystemWatcher来在删除临时文件时引发事件,这时它将删除temp目录的所有直接子文件。您正在等待至少一个临时文件的删除,以触发(通过Deleted event)所有临时文件的删除。

您可以使此操作更可预测且更简单。如果要从临时目录中删除文件,然后只需从临时目录中删除文件。您已经在TempDeletionService方法中有了执行此操作的代码:

var dir = new DirectoryInfo(@"C:\Users\xyz\AppData\Local\Temp");
foreach(var file in Directory.GetFiles(dir.ToString()))
{
    File.Delete(file);
}

只要运行那个。除非您希望服务以createdmodified的形式删除临时文件(这似乎有问题;应用程序至少在最初需要这些文件),否则此处不需要FileSystemWatcher