我已经创建了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目录中的文件/文件夹。我尝试了其他方法,但没有帮助。
答案 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);
}
只要运行那个。除非您希望服务以created或modified的形式删除临时文件(这似乎有问题;应用程序至少在最初需要这些文件),否则此处不需要FileSystemWatcher