public virtual CertificateCatalogFile GetCatalogFile(CertificateSource source, FileCleaner cleaner) { var downloader = new FtpDownloader(); var uri = new Uri(source.DecodeTableUrl); if (uri.Scheme.Match("ftp")) { var downloadFiles = downloader.DownloadedFiles(uri, source.LastDecodeTableDownload.HasValue ? source.LastDecodeTableDownload.Value : DateTime.MinValue, DownHandlerPath); if (downloadFiles.Count > 0) { return(new CertificateCatalogFile(source, downloadFiles[0].FileDate, downloadFiles[0].FileName)); } else { _logger.DebugFormat("Файл {0} не найден", uri); } } else if (uri.Scheme.Match("file")) { var src = new FileInfo(uri.LocalPath); if (!src.Exists) { return(null); } //в базе даты хранятся с точнотью до секунды сравнивать их нужно так же if (Math.Abs((DateTime.Now - src.LastWriteTime).TotalMilliseconds) > Settings.Default.FileDownloadInterval && Math.Abs((source.LastDecodeTableDownload.GetValueOrDefault() - src.LastWriteTime).TotalSeconds) > 1) { var dst = src.CopyTo(cleaner.TmpFile(), true); return(new CertificateCatalogFile(source, src.LastWriteTime, dst.FullName)); } } return(null); }
public override void GetFilesFromSource(CertificateTask task, IList <CertificateFile> files) { var catalogs = CertificateSourceCatalog.Queryable .Where( c => c.CertificateSource.Id == task.CertificateSource.Id && c.SerialNumber == task.DocumentLine.SerialNumber && c.CatalogProduct.Id == task.DocumentLine.ProductEntity.CatalogProduct.Id) .ToList(); if (catalogs.Count == 0) { task.DocumentLine.CertificateError = "Нет записи в таблице перекодировки"; return; } var tempDowloadDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); TMPDownloadDir = tempDowloadDir; if (!Directory.Exists(tempDowloadDir)) { Directory.CreateDirectory(tempDowloadDir); } var downloader = new FtpDownloader(); try { foreach (var certificateSourceCatalog in catalogs) { var dirName = ExtractFtpDir(certificateSourceCatalog.OriginFilePath); var fileName = ExtractFileName(certificateSourceCatalog.OriginFilePath); var uri = new UriBuilder(task.CertificateSource.LookupUrl) { Path = Path.Combine(dirName, fileName) }.Uri; var downloadFiles = downloader.DownloadedFiles(uri, DateTime.MinValue, tempDowloadDir); if (downloadFiles.Count > 0) { files.Add(new CertificateFile( downloadFiles[0].FileName, certificateSourceCatalog.OriginFilePath, fileName, task.CertificateSource)); } } } finally { if (!String.IsNullOrEmpty(tempDowloadDir) && Directory.Exists(tempDowloadDir) && Directory.GetDirectories(tempDowloadDir).Length == 0 && Directory.GetFiles(tempDowloadDir).Length == 0) { Directory.Delete(tempDowloadDir); } } if (files.Count == 0) { task.DocumentLine.CertificateError = "Файл сертификата не найден на ftp поставщика"; } }