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);
 }