예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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);
        }