/// <summary> /// Loguje wywołanie synchronizacji, która wykonała transfery plików /// </summary> /// <param name="sync">Informacja o uruchomieniu workera i skopiowanych plikach</param> /// <returns>Komunikat o ewentualnym błędzie</returns> public static string LogSync(FtpSyncModel sync) { SqlConnection conn = new SqlConnection(IFtpDiligentDatabaseClient.connStr); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "exec [ftp].[sp_log_download] @transdir,@xx,@sync_time,@file_name,@file_size,@file_date"; var par = cmd.Parameters; par.Add("transdir", SqlDbType.TinyInt).Value = sync.direction; par.Add("xx", SqlDbType.Int).Value = sync.xx; par.Add("sync_time", SqlDbType.DateTime).Value = sync.syncTime; par.Add("file_name", SqlDbType.VarChar, 256); par.Add("file_size", SqlDbType.BigInt); par.Add("file_date", SqlDbType.DateTime2); string ret = string.Empty; for (int i = 0; i < sync.fileNames.Length; ++i) { par[3].Value = sync.fileNames[i]; par[4].Value = sync.fileSizes[i]; par[5].Value = sync.fileDates[i]; ret = ExecuteNonQuery(cmd); if (!string.IsNullOrEmpty(ret)) { break; } } return(ret); }
/// <summary> /// Loguje wywołanie synchronizacji, która nie wykonała żadnych transferów /// </summary> /// <param name="sync">Informacja o uruchomieniu workera i skopiowanych plikach</param> /// <returns>Komunikat o ewentualnym błędzie</returns> public static async Task <string> LogActivation(FtpSyncModel sync) { OracleConnection conn = new OracleConnection(IFtpDiligentDatabaseClient.connStr); OracleCommand cmd = conn.CreateCommand(); cmd.CommandText = "begin log_nodownload(:sch_xx,:sync_time); end;"; cmd.Parameters.Add("sch_xx", OracleDbType.Int32).Value = sync.xx; cmd.Parameters.Add("sync_time", OracleDbType.Date).Value = sync.syncTime; return(await ExecuteNonQueryAsync(cmd)); }
/// <summary> /// Loguje wywołanie synchronizacji, która nie wykonała żadnych transferów /// </summary> /// <param name="sync">Informacja o uruchomieniu workera i skopiowanych plikach</param> /// <returns>Komunikat o ewentualnym błędzie</returns> public static string LogActivation(FtpSyncModel sync) { SqlConnection conn = new SqlConnection(IFtpDiligentDatabaseClient.connStr); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "exec [ftp].[sp_log_activation] @xx,@sync_time"; cmd.Parameters.Add("xx", SqlDbType.Int).Value = sync.xx; cmd.Parameters.Add("sync_time", SqlDbType.DateTime2).Value = sync.syncTime; return(ExecuteNonQuery(cmd)); }
/// <summary> /// £¹czy siê z endpointem i pobiera wszystkie pliki póŸniejsze ni¿ data ostatniego pobrania /// </summary> /// <param name="log">Informacja o skopiowanych plikach</param> /// <returns>Tablice nazw pobranych plików oraz ich rozmiarów</returns> public bool Download(ref FtpSyncModel log) { if (!CheckLocalDirectory() || !CheckDispatcher()) { return(false); } Connect(); var lsFileNames = new List <string>(); var llFileSizes = new List <long>(); var ldFileDates = new List <DateTime>(); var files = m_ftpsClient.GetListing().Where(f => f.Type == FtpFileSystemObjectType.File).ToArray(); foreach (FtpListItem f in files) { if (GetFile(f)) { lsFileNames.Add(f.Name); llFileSizes.Add(f.Size); ldFileDates.Add(f.Modified); if (m_showError != null) { m_showError(eSeverityCode.FileInfo, $"1|{f.Name}|{f.Size}|{f.Modified.ToBinary()}"); } } } if (m_Disp != null && !m_Disp.InProgress && m_showError != null) { m_showError(eSeverityCode.Message, $"Pobieranie z serwera {m_sHost}{m_sRemoteDir} zosta³o przerwane przez u¿ytkownika"); } m_ftpsClient.Disconnect(); log.fileNames = lsFileNames.ToArray(); log.fileSizes = llFileSizes.ToArray(); log.fileDates = ldFileDates.ToArray(); return(true); }
/// <summary> /// £¹czy siê z endpointem i wstawia wszystkie pliki z lokalnego katalogu /// </summary> /// <param name="log">Informacja o skopiowanych plikach</param> /// <returns>Status powodzenia operacji</returns> public bool Upload(ref FtpSyncModel log) { if (!CheckLocalDirectory() || !CheckDispatcher()) { return(false); } Connect(); var lsFileNames = new List <string>(); var llFileSizes = new List <long>(); var ldFileDates = new List <DateTime>(); foreach (string sFileName in Directory.GetFiles(m_sLocalDir)) { var fi = new FileInfo(sFileName); if (m_Disp.InProgress && PutFile(fi)) { lsFileNames.Add(fi.Name); llFileSizes.Add(fi.Length); ldFileDates.Add(fi.LastWriteTime); if (m_showError != null) { m_showError(eSeverityCode.FileInfo, $"2|{fi.Name}|{fi.Length}|{fi.LastWriteTime.ToBinary()}"); } } } if (m_Disp != null && !m_Disp.InProgress && m_showError != null) { m_showError(eSeverityCode.Message, $"Wstawianie na serwer {m_sHost}{m_sRemoteDir} zosta³o przerwane przez u¿ytkownika"); } m_ftpsClient.Disconnect(); log.fileNames = lsFileNames.ToArray(); log.fileSizes = llFileSizes.ToArray(); log.fileDates = ldFileDates.ToArray(); return(true); }
/// <summary> /// Loguje wywołanie synchronizacji, która wykonała transfery plików /// </summary> /// <param name="sync">Informacja o uruchomieniu workera i skopiowanych plikach</param> /// <returns>Komunikat o ewentualnym błędzie</returns> public static async Task <string> LogSync(FtpSyncModel sync) { OracleConnection conn = new OracleConnection(IFtpDiligentDatabaseClient.connStr); OracleCommand cmd = conn.CreateCommand(); cmd.CommandText = "begin log_download(:transdir,:sch_xx,:sync_fime,:file_names,:file_sizes,:file_dates); end;"; var par = cmd.Parameters; par.Add("transdir", OracleDbType.Byte).Value = sync.direction; par.Add("sch_xx", OracleDbType.Int32).Value = sync.xx; par.Add("sync_time", OracleDbType.Date).Value = sync.syncTime; par.Add("file_names", OracleDbType.Varchar2, 256).CollectionType = OracleCollectionType.PLSQLAssociativeArray; par.Add("file_sizes", OracleDbType.Int64).CollectionType = OracleCollectionType.PLSQLAssociativeArray; par.Add("file_dates", OracleDbType.Date).CollectionType = OracleCollectionType.PLSQLAssociativeArray; par[3].Value = sync.fileNames; par[4].Value = sync.fileSizes; par[5].Value = sync.fileDates; par[3].Size = par[4].Size = par[5].Size = sync.fileNames.Length; return(await ExecuteNonQueryAsync(cmd)); }
/// <summary> /// Wykonuje transfer plików na podstawie zaplanowanej pozycji harmonogramu /// Jest uruchamiana przez dispatcher o odpowiedniej porze i tylko dla poprawnych pozycji harmonogramu /// </summary> /// <param name="iSchXX"> /// Jeœli dodatni, to identyfikator pozycji harmonogramu uruchomionej automatycznie, /// jeœli ujemny, to identyfikator endpointu, dla którego transfer uruchomiono rêcznie /// </param> public void ExecuteFtpTransfer(object o) { FtpScheduleModel schedule = (FtpScheduleModel)o; int key = schedule.xx; var(endpoint, errmsg) = FtpDiligentDatabaseClient.SelectEndpoint(key).Result; if (!string.IsNullOrEmpty(errmsg)) { if (errmsg == "0") { errmsg = "Brak definicji endpointu dla harmonogramu: " + key; } m_mainWnd.ShowErrorInfo(eSeverityCode.Error, errmsg); return; } string remote = endpoint.host + endpoint.remDir; FtpSyncModel log = new FtpSyncModel() { xx = key, syncTime = endpoint.nextSync }; IFtpUtility fu = IFtpUtility.Create(endpoint, this, m_mainWnd.m_syncMode); eFtpDirection eDirection = endpoint.direction; if (key < 0) { m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Rozpoczêto transfer plików z serwera {remote}"); } else { m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Rozpoczêto zaplanowany transfer plików {schedule.name} z serwera {remote}"); } try { // transferuj pliki #region pobieranie if (eDirection.HasFlag(eFtpDirection.Get)) { if (!fu.Download(ref log)) { m_mainWnd.ShowErrorInfo(eSeverityCode.TransferError, $"Pobieranie plików z serwera {remote} zakoñczy³o siê niepowodzeniem"); return; } // loguj zmiany int filesTransfered = log.fileNames.Length; if (filesTransfered == 0) { FtpDiligentDatabaseClient.LogActivation(log); m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Na serwerze {remote} nie znaleziono plików odpowiednich do pobrania"); } else { log.direction = eFtpDirection.Get; FtpDiligentDatabaseClient.LogSync(log); m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Pobrano {filesTransfered} plików z serwera {remote}"); } } #endregion #region wstawianie if (eDirection.HasFlag(eFtpDirection.Put)) { if (!fu.Upload(ref log)) { m_mainWnd.ShowErrorInfo(eSeverityCode.TransferError, $"Wstawianie plików na serwer {remote} zakoñczy³o siê niepowodzeniem"); return; } // loguj zmiany int filesTransfered = log.fileNames.Length; if (filesTransfered == 0) { FtpDiligentDatabaseClient.LogActivation(log); m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Nie znaleziono plików do wstawienia na serwer {remote}"); } else { log.direction = eFtpDirection.Put; FtpDiligentDatabaseClient.LogSync(log); m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Wstawiono {filesTransfered} plików na serwer {remote}"); } } #endregion } catch (FtpUtilityException fex) { m_mainWnd.ShowErrorInfo(eSeverityCode.TransferError, fex.Message); } catch (Exception se) { m_mainWnd.ShowErrorInfo(eSeverityCode.TransferError, se.Message); } }
/// <summary> /// £¹czy siê z endpointem i pobiera wszystkie pliki póŸniejsze ni¿ data ostatniego pobrania /// </summary> /// <param name="log">Informacja o skopiowanych plikach</param> /// <returns>Tablice nazw pobranych plików oraz ich rozmiarów</returns> public bool Download(ref FtpSyncModel log) { if (!CheckLocalDirectory() || !CheckDispatcher()) { return(false); } Connect(); var lsFileNames = new List <string>(); var llFileSizes = new List <long>(); var ldFileDates = new List <DateTime>(); var pFD = new WIN32_FIND_DATA(); IntPtr hFind = FtpFindFirstFile(hFtpSess, IntPtr.Zero, pFD, INTERNET_FLAG_RELOAD, iContext); if (hFind == IntPtr.Zero) { if (Marshal.GetLastWin32Error() != ERROR_NO_MORE_FILES) { throw new FtpUtilityException("B³¹d przegl¹dania zasobu " + m_sHost + m_sRemoteDir); } else { goto noFilesFound; } } if (GetFile(pFD)) { var size = FoundSize2Long(pFD); var last = FoundTime2DateTime(pFD.ftLastWriteTime); lsFileNames.Add(pFD.cFileName); llFileSizes.Add(size); ldFileDates.Add(last); if (m_showError != null) { m_showError(eSeverityCode.FileInfo, $"1|{pFD.cFileName}|{size}|{last.ToBinary()}"); } } while (InternetFindNextFile(hFind, pFD) && m_Disp.InProgress) { if (GetFile(pFD)) { var size = FoundSize2Long(pFD); var last = FoundTime2DateTime(pFD.ftLastWriteTime); lsFileNames.Add(pFD.cFileName); llFileSizes.Add(size); ldFileDates.Add(last); if (m_showError != null) { m_showError(eSeverityCode.FileInfo, $"1|{pFD.cFileName}|{size}|{last.ToBinary()}"); } } } if (m_Disp != null && !m_Disp.InProgress && m_showError != null) { m_showError(eSeverityCode.Message, $"Pobieranie z serwera {m_sHost}{m_sRemoteDir} zosta³o przerwane przez u¿ytkownika"); } if (Marshal.GetLastWin32Error() != ERROR_NO_MORE_FILES) { throw new FtpUtilityException("B³¹d pobierania z zasobu " + m_sHost + m_sRemoteDir); } noFilesFound: InternetCloseHandle(hFind); Dispose(); log.fileNames = lsFileNames.ToArray(); log.fileSizes = llFileSizes.ToArray(); log.fileDates = ldFileDates.ToArray(); return(true); }