public void DoSync(IFileStateInfo fileStateInfo) { string serverFileName = string.Format("{0}{1}", _config.FtpPath, Path.GetFullPath(fileStateInfo.FileName). Replace(Path.GetFullPath(_config.FileSystemPath), string.Empty). Replace('\\', '/')); _logger.Debug(string.Format("[{1}] > {0} Remote:({2})\n", fileStateInfo.FileName, fileStateInfo.StateInfo.Status, serverFileName)); using (FtpClient ftpClient = CreateFtpClient()) { switch (fileStateInfo.StateInfo.Status) { case FileStatus.Added: if (!fileStateInfo.IsDirectory) { ftpClient.Upload(fileStateInfo.FileName, serverFileName); } else { ftpClient.CreateDirectory(serverFileName); } break; case FileStatus.Changed: if (!fileStateInfo.IsDirectory) { ftpClient.Upload(fileStateInfo.FileName, serverFileName); } break; case FileStatus.Removed: if (ftpClient.FileExists(serverFileName)) { ftpClient.DeleteFile(serverFileName); } else if(ftpClient.DirectoryExists(serverFileName)) { ftpClient.DeleteDirectory(serverFileName); } else { throw new Exception("No such file or directory"); } break; case FileStatus.Renamed: throw new Exception("Renames are not supported"); } } }
private void ProcessChange(IFileStateInfo stateData, Func<IFileStateInfo, Exception, SyncErrorResolution> resolveErrorCallback) { while (true) { try { SynchronisationEngine.DoSync(stateData); Processed(stateData.FileName, ProcessedStatus.Success); break; } catch (Exception ex) { SyncErrorResolution syncErrorResolution = resolveErrorCallback(stateData, ex); switch (syncErrorResolution) { case SyncErrorResolution.Retry: OnStateChanged(string.Format("Retrying to upload: {0}", stateData.FileName)); break; case SyncErrorResolution.Forget: Processed(stateData.FileName, ProcessedStatus.Skipped); OnStateChanged(string.Format("Forgetting {0}", stateData.FileName)); return; case SyncErrorResolution.Later: _logger.Warn(ex.ToString()); OnStateChanged(string.Format("Skipped {0}", stateData.FileName)); return; } } } }
private SyncErrorResolution ResolveErrorCase(IFileStateInfo stateData, Exception ex) { DialogResult result = _messageBoxResolver.Show(string.Format("Не удалось синхронизировать\n" + "[{1}]:{0}\n" + "по причине ошибки: {2}\n" + "Попробуем ещё раз?\n" + "Yes - Повторить попытку\n" + "No - Забыть про это изменение\n" + "Cancel - Решить позже", stateData.FileName, stateData.StateInfo.Status, ex.Message), "Решай, смертный!!1АдИН", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); return result == DialogResult.Yes ? SyncErrorResolution.Retry : (result == DialogResult.No ? SyncErrorResolution.Forget : SyncErrorResolution.Later); }