Служба удаления временных файлов Windows - PullRequest
0 голосов
/ 08 декабря 2018

Я создал службу 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;
    }
}

Программа работает нормально, но не удаляет файлы / папки влокальный временный каталог.Я пробовал разные подходы, но без помощи.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Во-первых, ваш код никогда не удалит каталоги, потому что Directory.GetFiles возвращает только файлы, а не каталоги.Чтобы получить как файлы, так и каталоги, позвоните Directory.GetFileSystemEntries.Какой бы метод вы ни вызывали, перегрузка, которая принимает один параметр пути, возвращает только те объекты, которые являются непосредственными дочерними элементами указанного каталога.Если вы хотите включить объекты в дочерние каталоги, вам нужно вызвать перегрузку, которая принимает SearchOption параметр .

Во-вторых, то, что делает ваш класс DeleteTempFileService, создает FileSystemWatcher, чтобы вызвать событие при удалении временного файла, после чего он удаляет все непосредственные дочерние файлы временного каталога.Вы ожидаете удаления хотя бы одного временного файла, чтобы инициировать (посредством Deleted событие ) удаление всех временных файлов.

Вы можете сделать это более предсказуемым и менее сложным,Если вы хотите удалить файлы из временного каталога, , просто удалите файлы из временного каталога .У вас уже есть код для этого в вашем TempDeletionService методе:

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

Просто запустите его.Если вы не хотите, чтобы ваша служба удаляла временные файлы, поскольку они созданы или изменены (что кажется проблематичным; приложениям нужны эти файлы по крайней мере на начальном этапе), вам не нужно FileSystemWatcher здесь.

0 голосов
/ 08 декабря 2018

Я не знаю, правильно ли я понимаю вашу цель.Кажется, вы просто хотите удалить временные файлы автоматически.Если это так, ваш подход, похоже, имеет некоторые проблемы: Возможно, вы неправильно поняли FileSystemWatcher?FileSystemWatcher запускается после операции с файлом, вы зарегистрировали мониторинг операции удаления файла, но после того, как файл удален, какая польза?Вы можете отслеживать операцию FileSystemWatcher.Created, а затем удалять соответствующий файл / папку.Если вы просто хотите удалить файл, я думаю, что это хороший выбор - использовать таймер или нить.В конце концов, накладные расходы на FileSystemWatcher немного велики, если только вам не нужны операции в реальном времени.

Скажем немного не по теме: я предлагаю не использовать анонимный метод и другие синтаксические сахара, писать традиционные методы, анонимные методы могут сделать людей ленивыми, здесь почти нет пользы: не способствует упаковке и изоляции, неспособствует чтению, влияет на структуру кода и надежность.Не используйте ключевое слово var, за исключением того, что оно может быть ленивым, это не помогает.Немного сахара будет хорошо, слишком много сахара сделает людей больными, теперь Microsoft и C # становятся все более и более странными, C # становится «сложным», грамматика сложна, становится все более и более странной, если ее полностью использоватьПоследний синтаксический сахар и традиционная грамматика для написания, даже не на одном языке, это краткое C #?Конечно, ритм синтаксического сахара широко распространен и на других языках, что не очень хорошее явление.

Наконец, благодаря Google Translate мой уровень диктовки в английском языке хуже моего уровня чтения английского.

...