コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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));
        }
コード例 #3
0
        /// <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));
        }
コード例 #4
0
ファイル: FtpsUtility.cs プロジェクト: vSzemkel/FtpDiligent
        /// <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);
        }
コード例 #5
0
ファイル: FtpsUtility.cs プロジェクト: vSzemkel/FtpDiligent
        /// <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);
        }
コード例 #6
0
        /// <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));
        }
コード例 #7
0
ファイル: FtpDispatcher.cs プロジェクト: vSzemkel/FtpDiligent
        /// <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);
            }
        }
コード例 #8
0
        /// <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);
        }