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);
        }
Пример #2
0
        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 поставщика";
            }
        }