ここにFileWatcherを使用しているコードがあります。私たちが行うことができるようにしたいことは
await Utils.DeleteDirectoryAsync("c:\temp\foo", recurse: true);
ある以下
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();
}
}
}
と上記観測可能を活用するいくつかのutilsのそれを実装しています。
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;
}
}
たちは、コードの残りの部分を見ることはできますか?また、どのような種類のファイルシステム(ローカルNTFSまたは何らかの形式のNFS)がありますか?とにかく、NTFS上のほとんどのファイルシステムの削除操作はアトミックです。 –
これはNTFS上です。興味のあるコードの部分。Deleteメソッドは、ディレクトリ内のすべてのファイルとディレクトリ自体を再帰的に削除します。私はそれが関係しているとは思わなかったので、私はファイルを削除する必要があると言った...それは同じものですね。 – kr85
全くありません。私は答えを残します –