Tenho um processo que precisa mover intermitentemente alguns arquivos de um diretório para outro. Antes de mover os arquivos, preciso garantir que um usuário não esteja adicionando arquivos ao diretório no momento - se estiver, quero esperar até que nenhum arquivo novo tenha sido adicionado ao diretório por N segundos antes de continuar o processo (o valor de N realmente não importa aqui).
Minha ideia original era usar um FileSystemWatcher
para capturar eventos de criação de arquivo, usar o .Throttle()
método de Rx para obter o último evento gerado dentro do período de tempo especificado e usar o resultado disso para desabilitar um loop de atraso infinito. O problema é que esse método apenas esperará para sempre se um usuário nunca fizer nenhuma alteração no diretório. De alguma forma, preciso que isso espere pelo menos N segundos e, se não houver nenhuma alteração dentro desse período de tempo, continue. Se houver uma alteração dentro desse período de tempo, espere até que N segundos tenham se passado desde a última alteração.
Aqui está o que tenho até agora:
Console.WriteLine("start");
// wait to ensure no changes are being made to the directory
await Task.Run(async () =>
{
var watcher = new FileSystemWatcher("D:\\Users\\mwcjk1\\source\\repos\\RandomTestAppNet8\\RandomTestAppNet8\\");
watcher.EnableRaisingEvents = true;
watcher.Created += (o, a) => { Console.WriteLine("file changed!"); };
var subject = Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
ev => watcher.Created += ev,
ev => watcher.Created -= ev
);
bool done = false;
// wait for 7 seconds after the last file creation
var disposable = subject.Throttle(TimeSpan.FromSeconds(7)).Subscribe(events => { done = true; });
Console.WriteLine("Set up observer");
while (!done)
{
await Task.Delay(1000);
//Console.WriteLine("Waited 1 sec");
}
disposable.Dispose();
});
// Continue with the rest of the method execution
Console.WriteLine("done!");
Eu também não gosto do Task.Delay()
loop - parece que deveria haver uma maneira muito mais elegante de fazer isso ( .Throttle()
parece tão perto de funcionar sozinho!), mas não consegui descobrir.
Qualquer conselho é muito apreciado, obrigado!