簡體   English   中英

等待使用FileSystemWatcher刪除所有文件

[英]Wait for all files to be deleted using FileSystemWatcher

我有一個控制台應用程序,需要監視特定目錄並等待所有文件刪除特定時間。 如果超過該時間之后,並且尚未刪除所有文件,則需要程序引發異常。 我該怎么做?

    public static void FileWatcher(string fileName, int timeToWatch)
    {
        FileSystemWatcher watcher = new FileSystemWatcher();

        try
        {
            watcher.Path = myPath;
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            watcher.Filter = string.Format("*{0}*", fileName);
            watcher.Deleted += new FileSystemEventHandler(OnChanged);
            watcher.EnableRaisingEvents = true;
        }
        catch
        {
            throw;
        }
    }

您可以使用Task.Delay設置超時(我假設timeToWatch以毫秒為單位,如果沒有,則相應地進行更改)。 如果目錄中沒有其他文件(不檢查子文件夾),則它將其他任務設置為已完成。 該方法將阻塞( WaitAny ),直到發生超時或文件全部刪除為止。 如果需要,可以輕松將其更改為async

public static void FileWatcher(string fileName, int timeToWatch)
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    var timeout = Task.Delay(timeToWatch);
    var completedTcs = new TaskCompletionSource<bool>();

    watcher.Path = myPath;
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.Filter = string.Format("*{0}*", fileName);
    watcher.Deleted += (s, e) => OnChanged(myPath, timeout, completedTcs);
    watcher.EnableRaisingEvents = true;

    OnChanged(myPath, timeout, completedTcs);

    // Wait for either task to complete
    var completed = Task.WaitAny(completedTcs.Task, timeout);

    // Clean up
    watcher.Dispose();

    if (completed == 1)
    {
        // Timed out            
        throw new Exception("Files not deleted in time");
    }
}

public static void OnChanged(string path, Task timeout, TaskCompletionSource<bool> completedTcs)
{
    if (!Directory.GetFiles(path).Any())
    {
        // All files deleted (not recursive)
        completedTcs.TrySetResult(true);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM