public override string[] UnionFiles(string[] InputFiles) { var inputList = new List <string>(InputFiles); var outputList = new List <string>(); while (inputList.Count > 0) { var shortName = Path.GetFileName(inputList[0]); if (shortName.EndsWith(".dbf", StringComparison.OrdinalIgnoreCase) && (shortName.StartsWith("b_", StringComparison.OrdinalIgnoreCase) || shortName.StartsWith("h_", StringComparison.OrdinalIgnoreCase))) { var doubleName = Path.GetFileNameWithoutExtension(shortName).Substring(2); if (shortName.StartsWith("b_", StringComparison.OrdinalIgnoreCase)) { doubleName = "h_" + doubleName + ".dbf"; } else { doubleName = "b_" + doubleName + ".dbf"; } //Попытка найти пару к файлу var originalDoubleName = inputList.Find(s => s.Equals(Path.GetDirectoryName(inputList[0]) + Path.DirectorySeparatorChar + doubleName, StringComparison.OrdinalIgnoreCase)); //Если нашли, то архивируем оба файла, если не нашли и файл создан давно, то архивируем один файл if (originalDoubleName != default(string)) { FileHelper.ClearReadOnly(inputList[0]); FileHelper.ClearReadOnly(originalDoubleName); //todo: filecopy здесь происходит копирование полученных файлов во временную папку для дальнейшего разбора ситуации, из-за предположения, что есть проблема с пропажей документов var archiveFileName = ArhiveFiles(new[] { inputList[0], originalDoubleName }); outputList.Add(archiveFileName); File.Delete(inputList[0]); File.Delete(originalDoubleName); inputList.Remove(originalDoubleName); } else if (DateTime.Now.Subtract(File.GetLastWriteTime(inputList[0])).TotalMinutes > 6 * Settings.Default.FileDownloadInterval) { //Ждали пару к файлу, но так и не дождались outputList.Add(ArhiveFiles(new[] { inputList[0] })); File.Delete(inputList[0]); } inputList.RemoveAt(0); } else { //Если это не документы накладных, то просто добавляем их в результирующий список outputList.Add(inputList[0]); inputList.RemoveAt(0); } } return(outputList.ToArray()); }
private void GetCurrentFile(string sourceFile) { CurrFileName = String.Empty; var destination = DownHandlerPath + Path.GetFileName(sourceFile); try { if (File.Exists(destination)) { File.Delete(destination); } FileHelper.ClearReadOnly(sourceFile); File.Copy(sourceFile, destination); CurrFileName = destination; } catch (Exception ex) { Log(ex, String.Format("Не удалось скопировать файл {0} в {1}", sourceFile, destination)); } }
/// <summary> /// Забирает файлы из фтп директории, сохраняет их локально и возвращает список локальных путей для этих файлов. /// Если при получении какого-то файла произошла ошибка, то пытается получить этот файл еще 2 раза, если не удалось, /// тогда имя этого файла добавляется в список FailedFiles. /// </summary> /// <param name="ftpHost">Имя хоста</param> /// <param name="ftpPort">Номер порта</param> /// <param name="ftpDirectory">Директория</param> /// <param name="username">Логин</param> /// <param name="password">Пароль</param> /// <param name="fileMask">Маска имени файла (на соответствие маске проверяется каждый файл)</param> /// <param name="lastDownloadTime">Время, когда была последняя загрузка</param> /// <param name="downloadDirectory">Директория, куда будут сохранены загруженные файлы</param> /// <param name="ftpPassiveMode">Пассивный режим для ftp-клиента</para> /// <returns>Список файлов, сохраненных локально</returns> public IList <DownloadedFile> GetFilesFromSource(string ftpHost, int ftpPort, string ftpDirectory, string username, string password, string fileMask, DateTime lastDownloadTime, string downloadDirectory, bool ftpPassiveMode = true) { var uri = new UriBuilder(ftpHost); ftpHost = uri.Host; if (!ftpDirectory.StartsWith(@"/", StringComparison.OrdinalIgnoreCase)) { ftpDirectory = @"/" + ftpDirectory; } var receivedFiles = new List <DownloadedFile>(); using (var ftpClient = new FTP_Client()) { var url = String.Format("ftp://{0}@{1}:{2}{3}/{4}", username, ftpHost, ftpPort, ftpDirectory, fileMask); _log.DebugFormat("Загрузка файлов с {0}", url); var dataSetEntries = GetFtpFilesAndDirectories(ftpClient, ftpHost, ftpPort, username, password, ftpDirectory, ftpPassiveMode); foreach (DataRow entry in dataSetEntries.Tables["DirInfo"].Rows) { if (Convert.ToBoolean(entry["IsDirectory"])) { continue; } var fileInDirectory = entry["Name"].ToString(); // Если файл не подходит по маске, берем следующий if (!PriceProcessor.FileHelper.CheckMask(fileInDirectory, fileMask)) { continue; } var fileWriteTime = Convert.ToDateTime(entry["Date"]); #if DEBUG if (UseStub) { lastDownloadTime = DateTime.Now.AddMonths(-1); } #endif if (((fileWriteTime.CompareTo(lastDownloadTime) > 0) && (DateTime.Now.Subtract(fileWriteTime).TotalMinutes > Settings.Default.FileDownloadInterval)) || ((fileWriteTime.CompareTo(DateTime.Now) > 0) && (fileWriteTime.Subtract(lastDownloadTime).TotalMinutes > 0))) { var downloadedFile = Path.Combine(downloadDirectory, fileInDirectory); try { #if !DEBUG ReceiveFile(ftpClient, fileInDirectory, downloadedFile); #else if (UseStub) { // Для тестов if (ftpDirectory.StartsWith(@"/", StringComparison.OrdinalIgnoreCase)) { ftpDirectory = ftpDirectory.Substring(1); } var path = Path.Combine(Settings.Default.FTPOptBoxPath, ftpDirectory); File.Copy(Path.Combine(path, fileInDirectory), downloadedFile, true); } else { ReceiveFile(ftpClient, fileInDirectory, downloadedFile); } #endif receivedFiles.Add(new DownloadedFile(downloadedFile, fileWriteTime)); FileHelper.ClearReadOnly(downloadedFile); } catch (Exception e) { _log.Debug(String.Format("Ошибка при попытке загрузить файл {0}", url), e); } } else { _log.DebugFormat("Файл {0} уже забран и дата файла еще не обновлена. Не забираем.", fileInDirectory); } } } return(receivedFiles); }