Waiting for system to delete file

后端 未结 7 652
野的像风
野的像风 2020-12-06 00:12

I had a problem with refreshing file list after deleting a file. When I gave command to delete file, the exception was thrown because the refresh method tried to access a fi

相关标签:
7条回答
  • 2020-12-06 00:48

    Here is some code using the FileWatcher. What we want to be able to do is

    await Utils.DeleteDirectoryAsync("c:\temp\foo", recurse: true);
    

    the below implements it

    using System;
    using System.IO;
    using System.Reactive;
    using System.Reactive.Linq;
    using System.Reactive.Subjects;
    using System.Threading.Tasks;
    
    namespace Utils
    {
        internal class FileWatcher : IDisposable
        {
            readonly FileSystemWatcher _Watcher;
    
            public Subject<FileSystemEventArgs> Changed = new Subject<FileSystemEventArgs>();
    
            public FileWatcher( string file )
            {
                // Create a new FileSystemWatcher and set its properties.
                _Watcher = new FileSystemWatcher
                           {
                               Path = Path.GetDirectoryName(file),
                               NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                                              | NotifyFilters.FileName | NotifyFilters.DirectoryName,
                               Filter =Path.GetFileName(file) 
                           };
    
                // Add event handlers.
                _Watcher.Changed += OnChanged;
                _Watcher.Created += OnChanged;
                _Watcher.Deleted += OnChanged;
                _Watcher.Renamed += OnChanged;
    
                // Begin watching.
                _Watcher.EnableRaisingEvents = true;
            }
    
            // Define the event handlers.
            private void OnChanged( object source, FileSystemEventArgs e )
            {
                Changed.OnNext(e);
            }
    
    
            public void Dispose()
            {
                _Watcher.Dispose();
            }
        }
    }
    

    and some utils that take advantage of the above observable.

    public static class FileUtils
    {
        public static IObservable<FileSystemEventArgs> ChangedObservable(string path)
        {
            if (path == null)
                return Observable.Never<FileSystemEventArgs>();
    
            return Observable.Using(() => new FileWatcher(path), watcher => watcher.Changed);
        }
    
        public static Task DeleteDirectoryAsync(string path, bool recurse)
        {
            var task = new TaskCompletionSource<Unit>();
    
            if (Directory.Exists(path))
            {
                ChangedObservable(path)
                    .Where(f => f.ChangeType == WatcherChangeTypes.Deleted)
                    .Take(1)
                    .Subscribe(v => task.SetResult(Unit.Default));
    
                Directory.Delete(path, recurse);
            }
            else
            {
                task.SetResult(Unit.Default);
            }
    
            return task.Task;
        }
    }
    
    0 讨论(0)
提交回复
热议问题