Files
Sun1602/Tools/WzFtpManager/WzFtpManager/SimpleFtp.h
T
2022-10-26 12:25:11 +08:00

137 lines
5.6 KiB
C++

#pragma once
#include <WinInet.h>
#include <map>
using namespace std;
#define WM_SHOW_DOWNLOAD_STATE WM_USER+6683
#define WM_SHOW_UPLOAD_STATE WM_USER+6684
#define MAX_BUFFER_SIZE 65536
#define REST 0 //이어받기/올리기
#define APPE 1 //파일끝에 이어올리기
class CSimpleFtp
{
public:
CSimpleFtp(void);
~CSimpleFtp(void);
public:
HINTERNET hSession;//인터넷 세션
HINTERNET hFtpConn;//FTP 세션
//업로드 또는 다운로드 파일 정보
struct FileInfo
{
TCHAR szFilePath[1024];//경로 + 파일명
ULONGLONG nFileSize;//파일크기
BOOL isDir;//디렉토리 여부
SYSTEMTIME stCreattionTime, stLastAccessTime, stLastWriteTime;//생성날짜, 최종접근일, 최종수정일
};
typedef map <CString, FileInfo> FILE_LIST;//업로드 또는 다운로드 목록(파일 및 디렉토리)을 구함
//전송중인 데이터 정보
struct TransferInfo_In
{
TCHAR szFilePath[1024];//전송중인 파일명(경로+파일명)
DWORD dwStartTime, dwCurrentTime;//전송시작시간, 전송현재시간(전송시작시간으로부터 경과한 시간을 구하는데 이용)
UINT64 nTotFileSize;//전송할 데이터의 총 크기
UINT64 nTransferSize;//현재 전송된 데이터 크기
};
struct TransferInfo_Out
{
TCHAR szFilePath[1024];//전송중인 파일명(경로+파일명)
UINT64 nTotFileSize;//전송할 데이터 총 크기
UINT64 nTransferSize;//현재 전송된 데이터 크기
int nRemainHour;//남은 시간
int nRemainMin;//남은 분
int nRemainSec;//남은 초
int nSpeed; //전송속도(초당 Byte). KB로 표시하려면 1024로 나누면 된다
int nPercent;//전송율(백분율로 표시한다)
};
private:
HWND hCallWnd;//호출한 부모윈도의 핸들. 현재 진행중인 상태를 메시지로 부모윈도에 보낼때 사용한다
HANDLE hCloseEvent;//예외적 종료. 전송중에 사용자가 취소하거나 서버로부터 강제종료된 경우 예외처리를 하는데 이용한다
BOOL bUtf8;//UTF8로 데이터(파일명, 디렉토리명) 전송
CString strIP, strID, strPasswd;//접속아이피, 아이디, 암호, Passive/Active모드
UINT nPort;//FTP 접속 포트(기본 21)
BOOL bPassive;
public:
//인터넷 상태(연결중, 연결완료, 연결종료중, 연결종료 등)의 이벤트를 받는 콜백함수.
friend void __stdcall CallMaster( HINTERNET, DWORD_PTR, DWORD, LPVOID, DWORD);
//로그인
BOOL Login(CString strIP, CString strID=_T("anonymous"), CString strPasswd=_T(""),
UINT nPort = INTERNET_DEFAULT_FTP_PORT, HWND hCallWnd = NULL, BOOL bUtf8 = TRUE, BOOL bPassive = FALSE);
//로그아웃
void LogOut();
//FTP서버에 연결되어있으면 TRUE, 아니면 FALSE
BOOL IsConnected();
//파일만 다운로드
BOOL DownloadFile(CString strRemoteFilePath, CString strLocalFilePath, BOOL bResume = FALSE);
//하위 디렉토리까지 포함하여 다운로드
BOOL DownloadWithSubDir(CString strRemoteDir, CString strLocalDir, BOOL bResume = FALSE);
//파일만 업로드
BOOL UploadFile(CString strLocalFilePath, CString strRemoteFilePath, BOOL bResume = FALSE);
//하위디렉토리포함 업로드
BOOL UploadWithSubDir(CString strLocalDir, CString strRemoteDir, BOOL bResume = FALSE);
//FTP서버에 디렉토리를 생성(서버에 없는 디렉토리는 생성한다. 가령 strRemoteDir이 /123/456/789인 경우 /123, /123/456 디렉토리가 없다면 생성한다)
int CreateRemoteDir(CString strRemoteDir);
//FTP서버 파일 또는 디렉토리 이름변경
BOOL RenameRemoteFile(CString strRemoteOldPath, CString strRemoteNewPath);
//FTP서버의 하위디렉토리 포함 삭제
BOOL DeleteRemoteDir(CString strRemoteDir);
//FTP서버의 파일 삭제
BOOL DeleteRemoteFile(CString strRemoteFilePath);
//FTP서버 현재 디렉토리 변경
BOOL SetRemoteDirectory(CString strRemoteDir);
//FTP서버의 현재 디렉토리 경로를 구함
BOOL GetRemoteDirectory(__out CString& strRemoteDir);
//FTP서버의 파일 크기를 구함(성공 TRUE, 실패 FALSE)
BOOL GetRemoteFileSize(__in CString strRemoteFilePath, __out UINT64& nRemoteFileSize);
//FTP서버에 특정 디렉토리가 있는지 확인. FTP서버에 디렉토리가 존재하면 1, 오류인경우 -1, 없으면 0
int FindRemoteDir(CString strRemoteDir);
//FTP서버에 특정 파일이 있는지 확인. FTP서버에 파일이 존재하면 존재하면 1, 오류인경우 -1, 없으면 0
int FindRemoteFile(CString strRemoteFilePath);
//하위 디렉토리 포함한 파일목록(디렉토리+파일)을 구함
BOOL GetRemoteFileListWithSubDir(__in CString strRemoteDir, __out FILE_LIST& file_list);
//FTP의 디렉토리 파일목록(디렉토리+파일)을 구함. 하위디렉토리 미포함
BOOL GetRemoteFileList(__in CString strRemoteDir, __out FILE_LIST& file_list);
protected:
void ShowLastErrorMsg();//FTP 에러메시지 표시
BOOL ReadyDownloadResume(UINT64 nStartFilePointer);//이어받기 준비
BOOL ReadyUploadResume(CString strRemoteFilePath, UINT64 nStartFilePointer);//이어올리기 준비
BOOL IsPositiveResponse();//서버로부터의 응답이 긍정적인지 부정적인지?
//FTP 핸들을 사용하지 않는 유틸리티성 함수들
public:
//업로드할 목록(하위디렉토리 + 파일)을 구함
UINT64 GetLocalFileListWithSubDir(__in CString strLocalDir, __out FILE_LIST& file_list);
//하위디렉토리 포함하여 디렉토리를 생성한다
//가령 strDirPath가 c:\123\456\789라면 c:\, c:\123, c:\123\456, c:\123\456\789 폴더를 생성한다
int CreateLocalDir(CString strDirPath);
UINT64 GetTotFileSize(__in FILE_LIST& file_list);//file_list에 저장된 파일의 총 크기를 리턴
CString GetWorkingDir();//현재 exe파일이 실행되는 경로를 구하는 함수
protected:
BOOL Login();//연결이 끊겼을 경우 자동로그인(사용자가 처음 로그인할때 입력한 정보를 이용한다)
//file_list에 파일정보(FileInfo)를 추가한다
CString AddRemoteFile(__in const CString strCurrentRemoteDir, __in const WIN32_FIND_DATAA& find_data, __out FILE_LIST& file_list);
//TransferInfo_In 정보를 이용하여 전송중인 파일이름, 전송속도, 남은시간, 전송데이터 크기를 구함
void GetTransferInfo(__in const TransferInfo_In& st_TransferInfo_In, __out TransferInfo_Out& st_TransferInfo_Out);
CStringA GetSendString(CString strSend);//파일명, 디렉토리명을 FTP로 보낼때 적절하게 문자열 인코딩
CString GetFileNameFromPath(CString strFilePath);//c:\123\456.txt라면 456.txt를 리턴
CString GetParentDirFromPath(CString strFilePath);//c:\123\456.txt라면 c:\123을 리턴
};