/// <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;
/// <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); }
public static extern bool InternetFindNextFile(IntPtr hFind, [Out][In] WIN32_FIND_DATA lpFindFileData);
/// <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); }
public static extern IntPtr FtpFindFirstFile(IntPtr hConnect, IntPtr lpszSearchFile, [Out][In] WIN32_FIND_DATA lpFindFileData, UInt32 dwFlags, IntPtr dwContext);