//копируем в нужную папку все файлы из временной директории public override void ActionAsDestination() { ControllerOfOutput output = ControllerOfOutput.Instance; DirectoryInfo di = new DirectoryInfo(SettingsClass.Instance.GetTmpDirName()); if (!this.checkDirectory(di)) { return; } foreach (FileInfo file in di.GetFiles()) { try { if (!Directory.Exists(this.CalculatedFilePath)) { Directory.CreateDirectory(this.CalculatedFilePath); } if (File.Exists(this.CalculatedFilePath + file.Name)) { string msg = String.Format("Файл {0} уже существует в папке {1}.", file.FullName, this.CalculatedFilePath + file.Name); output.WriteAverageMessage(msg); this.statistics.addMessage(msg); continue; } File.Copy(file.FullName, this.CalculatedFilePath + file.Name); output.WriteAverageMessage(String.Format("Файл {0} успешно передан в папку-назначение {1}", file.FullName, this.CalculatedFilePath + file.Name)); //throw new Exception(); this.statistics.incrementFiles(1); this.statistics.incrementBytesWithCut(file.Length); this.statistics.addResult(WorkResult.Success); } catch (Exception ex) { string errMsg = String.Format( "Ошибка при передаче файла {0} В папку {1}. Текст ошибки: {2}", file.Name, this.CalculatedFilePath, ex.Message); output.WriteErrors(errMsg); this.statistics.addError(errMsg); //пока не понятно нужен ли errorCount или нет //localErrorCount++; /* * if (localErrorCount > this.errorCount) * { * throw new FileExchangeException(errMsg); * } * Thread.Sleep(this.sleepBeforeNext); */ } } }
public override void ActionAsSource() { string tmpDirName = SettingsClass.Instance.GetTmpDirName(); ControllerOfOutput output = ControllerOfOutput.Instance; //string[] filenames = Directory.GetFiles(this.CalculatedFilePath); DirectoryInfo di = new DirectoryInfo(this.CalculatedFilePath); if (!this.checkDirectory(di)) { return; } foreach (FileInfo file in di.GetFiles()) { try { //проверка, подходит ли данный файл для передачи if (!this.addStrategy.FileVerification(file.Name, File.GetLastWriteTime(file.FullName).ToUniversalTime())) { continue; } output.WriteAverageMessage(String.Format("Передаем файл {0} во временную папку {1}.", file.FullName, tmpDirName + file.Name)); if (File.Exists(tmpDirName + file.Name)) { string errMsg2 = String.Format("Файл {0} уже передавался из других источников.", file.Name); output.WriteAverageMessage(errMsg2); this.statistics.addMessage(errMsg2); File.Delete(tmpDirName + file.Name); } File.Copy(file.FullName, tmpDirName + file.Name); output.WriteAverageMessage(String.Format("Файл {0} успешно передан.", file.FullName, tmpDirName + file.Name)); this.statistics.incrementFiles(1); this.statistics.incrementBytesWithCut(file.Length); this.statistics.addResult(WorkResult.Success); } catch (Exception ex) { string msg = String.Format( "Ошибка при передаче файла {0} Во временную папку. Текст ошибки: {1}", file.Name, ex.Message); output.WriteErrors(msg); this.statistics.addError(msg); //throw new FileExchangeException(String.Format("Ошибка при передачи файла {0} Во временную папку. Текст ошибки: {1}", file.Name, ex.Message)); } } }
private void Init() { string[] sepFields = new string[] { " " }; string[] sepDate = new string[] { "." }; string[] sepTime = new string[] { ":" }; StreamReader myStream = null; try { myStream = new StreamReader(this.lastLogPath); } catch (Exception ex) { this.checkStatus = false; ControllerOfOutput coo = ControllerOfOutput.Instance; coo.WriteErrors("Ошибка при попытке открыть файл логов работы. Текст ошибки" + ex.Message); return; } while (!myStream.EndOfStream) { string strToParse = myStream.ReadLine(); string[] parsingStr = strToParse.Split(sepFields, StringSplitOptions.RemoveEmptyEntries); try { List <int> parsingStrDate = StrArrToIntArr(parsingStr[1].Split(sepDate, StringSplitOptions.RemoveEmptyEntries)); List <int> parsingStrTime = StrArrToIntArr(parsingStr[2].Split(sepTime, StringSplitOptions.RemoveEmptyEntries)); SavedTaskResults tmpTsk = new SavedTaskResults(); tmpTsk.id = int.Parse(parsingStr[0]); tmpTsk.lastRun = new DateTime(parsingStrDate[2], parsingStrDate[1], parsingStrDate[0], parsingStrTime[0], parsingStrTime[1], parsingStrTime[2]); tmpTsk.isSuccess = bool.Parse(parsingStr[3]); this.prevRes.Add(tmpTsk); } catch (Exception) { continue; } } myStream.Close(); this.checkStatus = true; }
public bool checkDirectory(DirectoryInfo di) { ControllerOfOutput output = ControllerOfOutput.Instance; try { di.GetFiles(); } catch (Exception ex) { string errMsg = String.Format( "Ошибка при подключении к директории {0}. Текст ошибки: {1}", di.FullName, ex.Message); output.WriteErrors(errMsg); this.statistics.addError(errMsg); return(false); } return(true); }
//все задания могут содержать несколько источников и назначений //сначала на локальный компьютер передаются файлы из источников, а затем //они передаются в назначения public ResultController TaskStartsExchange(MyProxy prx, ResultController sessionResultController) { ResultController taskResultController = new ResultController("Выполнение задачи " + this.id); ControllerOfOutput outputs = ControllerOfOutput.Instance; //LogOfSuccession los = LogOfSuccession.Instance; //bool success = true; try { this.ClearTmpDir(); //Если есть роуты, добавляем их foreach (CmdRoute rt in taskRouts) { BatchRunner.AddRoute(rt.destination, rt.subnetMask, rt.gateway); } List <FileSupertype> downloadFiles = uploadDownload.FindAll(x => x.source_dest == ActionType.Source); List <FileSupertype> uploadFiles = uploadDownload.FindAll(x => x.source_dest == ActionType.Destination); foreach (FileSupertype dfile in downloadFiles) { ActionResult tmpRes = dfile.StartFileAction(prx); taskResultController.AddAction(tmpRes); } foreach (FileSupertype ufile in uploadFiles) { ActionResult tmpRes = ufile.StartFileAction(prx); taskResultController.AddAction(tmpRes); } this.ClearTmpDir(); } catch (Exception ex) { outputs.WriteErrors(ex.Message); } return(taskResultController); }
public override void ActionAsSource() { string tmpDirName = SettingsClass.Instance.GetTmpDirName(); ControllerOfOutput output = ControllerOfOutput.Instance; string ftpUriStr = "ftp://" + this.ftpUri + this.CalculatedFilePath; Dictionary <int, string> filesDict = new Dictionary <int, string>(); Dictionary <int, DateTime> filesModifDict = new Dictionary <int, DateTime>(); FtpWebResponse response = null; try { //здесь мы считываем список файлов, находящихся на ftp FtpWebRequest ftpReq = (FtpWebRequest)FtpWebRequest.Create(ftpUriStr); ftpReq = this.FtpSet(ftpReq); ftpReq.Method = WebRequestMethods.Ftp.ListDirectory; response = (FtpWebResponse)ftpReq.GetResponse(); StreamReader streamReader = new StreamReader(response.GetResponseStream()); int ind = 0; string line = streamReader.ReadLine(); while (!string.IsNullOrEmpty(line)) { filesDict.Add(ind++, line); line = streamReader.ReadLine(); } } catch (Exception ex) { string errMsg = String.Format("Ошибка при считывании списка файлов c Uri {0}. Текст ошибки: {1}", ftpUriStr, ex.Message); output.WriteErrors(errMsg); this.statistics.addError(errMsg); return; } //если используется дата создания, сперва нужно опросить каждый файл о дате его последней модификации foreach (KeyValuePair <int, string> fileName in filesDict) { FtpWebRequest request = null; try { request = (FtpWebRequest)WebRequest.Create(ftpUriStr + fileName.Value); request.Method = WebRequestMethods.Ftp.GetDateTimestamp; request = this.FtpSet(request); response = (FtpWebResponse)request.GetResponse(); filesModifDict.Add(fileName.Key, response.LastModified.ToUniversalTime()); //проверка, подходит ли данный файл для передачи if (!this.addStrategy.FileVerification(fileName.Value, filesModifDict[fileName.Key])) { continue; } } catch (Exception ex) { string errMsg = String.Format( "Ошибка при определении даты последней модификации файла {0}. Текст ошибки: {1}", fileName, ex.Message); output.WriteErrors(errMsg); this.statistics.addError(errMsg); return; } try { //при успешной проверке мы передаем файл во временную папку output.WriteAverageMessage(String.Format("Передаем файл {0} во временную папку", fileName.Value)); //если передаваемый файл существует во временной папке if (File.Exists(tmpDirName + fileName.Value)) { string errMsg2 = String.Format("Файл {0} уже передавался из других источников.", fileName.Value); output.WriteAverageMessage(errMsg2); this.statistics.addMessage(errMsg2); File.Delete(tmpDirName + fileName.Value); } FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create(ftpUriStr + fileName.Value); request2.Method = WebRequestMethods.Ftp.DownloadFile; request = this.FtpSet(request2); response = (FtpWebResponse)request2.GetResponse(); Stream stream = response.GetResponseStream(); List <byte> streamByteList = new List <byte>(); int b; long allBytesCount = 0; while ((b = stream.ReadByte()) != -1) { streamByteList.Add((byte)b); allBytesCount += b; } File.WriteAllBytes(tmpDirName + fileName.Value, streamByteList.ToArray()); this.statistics.incrementFiles(1); this.statistics.incrementBytesWithCut(new System.IO.FileInfo(tmpDirName + fileName.Value).Length); this.statistics.addResult(WorkResult.Success); } //ToDo: А что если такой файл уже будет существовать? catch (Exception ex) { //this.statistics.addResult(WorkResult.Error); string errMsg = String.Format( "Ошибка при передаче файла {0} во временную папку. Текст ошибки: {1}", fileName, ex.Message); output.WriteErrors(errMsg); this.statistics.addError(errMsg); return; //throw new FileExchangeException(errMsg); } output.WriteAverageMessage(String.Format("Файл {0} успешно передан во временную папку {1}", fileName.Value, tmpDirName + fileName.Value)); } Console.WriteLine(); }
public override void ActionAsDestination() { ControllerOfOutput output = ControllerOfOutput.Instance; DirectoryInfo di = new DirectoryInfo(SettingsClass.Instance.GetTmpDirName()); //int localErrorCount = 0; foreach (FileInfo file in di.GetFiles()) { string ftpUriStr = ""; try { ftpUriStr = @"ftp://" + this.ftpUri + "/" + file.Name; FtpWebRequest request = WebRequest.Create(new Uri(string.Format(ftpUriStr))) as FtpWebRequest; request.Method = WebRequestMethods.Ftp.UploadFile; request = this.FtpSet(request); //здесь непосредственно передача int totalReadBytesCount = 0; using (FileStream inputStream = File.OpenRead(file.FullName)) using (Stream outputStream = request.GetRequestStream()) { byte[] buffer = new byte[16384]; int prevByteCount = 0; int readBytesCount; while ((readBytesCount = inputStream.Read(buffer, 0, buffer.Length)) > 0) { outputStream.Write(buffer, 0, readBytesCount); totalReadBytesCount += readBytesCount; double progress = totalReadBytesCount * 100.0 / inputStream.Length; double totalKBytes = Math.Round((double)totalReadBytesCount / 1000, 0); double allKBytes = Math.Round((double)inputStream.Length / 1000, 0); prevByteCount = totalReadBytesCount; output.WriteProgress(String.Format("Progress: {0}% {1} Кб из {2} Кб.", Math.Round(progress, 2).ToString("##0.00"), totalKBytes, allKBytes)); } } this.statistics.incrementFiles(1); this.statistics.incrementBytesWithCut(file.Length); this.statistics.addResult(WorkResult.Success); } catch (Exception ex) { //сперва проверяем, не вылезла ли ошибка только потому, что такой файл уже существует FtpWebRequest request = WebRequest.Create(new Uri(string.Format(ftpUriStr))) as FtpWebRequest; request.Method = WebRequestMethods.Ftp.GetFileSize; request = this.FtpSet(request); try { FtpWebResponse response = (FtpWebResponse)request.GetResponse(); } catch (WebException wex) { FtpWebResponse response = (FtpWebResponse)wex.Response; if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) { string errMsg2 = String.Format("Файл {0} уже существует на ftp-сервере {1}.", file.FullName, ftpUriStr); output.WriteAverageMessage(errMsg2); this.statistics.addMessage(errMsg2); continue; } } string errMsg = String.Format( "Ошибка при передачи файла {0} На сервер {1}. Текст ошибки: {2}", file.Name, ftpUriStr, ex.Message); output.WriteErrors(errMsg); this.statistics.addError(errMsg); return; //localErrorCount++; /* * if (localErrorCount > this.errorCount) * { * throw new FileExchangeException(errMsg); * } * Thread.Sleep(this.sleepBeforeNext); */ } } }