示例#1
0
 /// <summary>
 /// Konwertuje rozmiar pliku
 /// </summary>
 /// <param name="fd">Struktura z WIN32 API</param>
 /// <returns>Rozmiar pliku</returns>
 Int64 FoundSize2Long(WIN32_FIND_DATA fd) => (Convert.ToInt64(fd.nFileSizeHigh) << 32) + fd.nFileSizeLow;
示例#2
0
        /// <summary>
        /// Pobiera plik zmodyfikowany po dacie ostatniej synchronizacji endpointu
        /// </summary>
        /// <param name="pFD">struktura opisuj¹ca plik lub katalog</param>
        /// <returns>Czy dosz³o do pobrania pliku</returns>
        private bool GetFile(WIN32_FIND_DATA pFD)
        {
            if ((pFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0)
            {
                return(false);
            }
            long size = FoundSize2Long(pFD);

            if (size == 0)
            {
                return(false);
            }

            DateTime lastWrite = FoundTime2DateTime(pFD.ftLastWriteTime);

            switch (m_SyncMode)
            {
            case eSyncFileMode.NewerThenRefreshDate:
                if (lastWrite < m_dtLastRefresh)
                {
                    return(false);
                }
                break;

            case eSyncFileMode.UniqueDateAndSizeOnDisk:
                if (CheckLocalStorage(pFD.cFileName, size))
                {
                    return(false);
                }
                break;

            case eSyncFileMode.UniqueDateAndSizeInDatabase:
                if (m_Disp.CheckDatabase(pFD.cFileName, size, lastWrite))
                {
                    return(false);
                }
                break;

            case eSyncFileMode.AllFiles:
                break;
            }

            if (!FtpGetFile(hFtpSess, pFD.cFileName, m_sLocalDir + pFD.cFileName, false, FILE_ATTRIBUTE_NORMAL, (uint)m_TransferMode, iContext))
            {
                var dirsep = m_sRemoteDir.EndsWith('/')? string.Empty : "/";
                throw new FtpUtilityException($"Kopiowanie {m_sHost}{m_sRemoteDir}{dirsep}{pFD.cFileName} do {m_sLocalDir} nie powiod³o siê");
            }

            if (m_mainWnd.m_checkTransferedStorage)
            {
                bool bStatus = CheckLocalStorage(pFD.cFileName, size);
                if (!bStatus && File.Exists(m_sLocalDir + pFD.cFileName))
                {
                    File.Delete(m_sLocalDir + pFD.cFileName);
                }
                return(bStatus);
            }

            if (m_Disp != null)
            {
                m_Disp.m_filesTransfered++;
            }

            return(true);
        }
示例#3
0
 public static extern bool InternetFindNextFile(IntPtr hFind, [Out][In] WIN32_FIND_DATA lpFindFileData);
示例#4
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);
        }
示例#5
0
 public static extern IntPtr FtpFindFirstFile(IntPtr hConnect, IntPtr lpszSearchFile, [Out][In] WIN32_FIND_DATA lpFindFileData, UInt32 dwFlags, IntPtr dwContext);