private async Task Retrieve(FtpClient client, string path, CancellationToken cancellation) { foreach (FtpListItem item in client.GetListing(path)) { cancellation.ThrowIfCancellationRequested(); if (item.Type == FtpFileSystemObjectType.File) { if (maskRegex.IsMatch(item.FullName) && predicate.CanDownload(tracking.LastScanned, item.FullName, item.Modified)) { if (item.Modified < DateTime.Now.AddMinutes(1)) { await ProcessFile(client, item).ConfigureAwait(false); predicate.Downloaded(item.FullName); } else { log.Debug("Ignoring file - too recent: <{0}>", item.FullName); } } } else if (item.Type == FtpFileSystemObjectType.Directory) { await Retrieve(client, item.FullName, cancellation).ConfigureAwait(false); } } }
public async Task <DateTime> Download(CancellationToken cancellation) { var path = Path.Combine(Environment.CurrentDirectory, config.Path); log.Info("Checking files: {0}", path); if (!Directory.Exists(path)) { log.Error("Directory not found: {0}", path); return(DateTime.Now); } foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) { try { cancellation.ThrowIfCancellationRequested(); if (predicate.CanDownload(lastScanned, file, File.GetLastWriteTime(file))) { await ProcessFile(file).ConfigureAwait(false); } File.Delete(file); } catch (Exception ex) { log.Error(ex); } } try { var directories = Directory.EnumerateDirectories(path, "*", SearchOption.AllDirectories); foreach (var directory in directories) { cancellation.ThrowIfCancellationRequested(); if (!Directory.EnumerateFileSystemEntries(directory).Any()) { log.Info("Removing empty: {0}", directory); Directory.Delete(directory); } } } catch (Exception ex) { log.Error(ex); } log.Info("Completed: {0}", path); var now = DateTime.Now; lastScanned = now; return(now); }