當前位置:首頁 » 文件管理 » mfc中ftp上傳與下載

mfc中ftp上傳與下載

發布時間: 2025-01-10 06:47:06

1. 想用socket+mfc寫一個ftp伺服器,但是文件操作出了問題,不知道怎麼寫,網上沒有這方面的教

//MFC里有CFtpConnection,你可以直接使用,不需要自己去寫
CInternetSessionsess(_T("MyFTPSession"));

CFtpConnection*pConnect=NULL;

try
{
//Requestaconnectiontoftp.microsoft.com.Default
//parametersmeanthatwe'lltrywithusername=ANONYMOUS
//@domainname
pConnect=sess.GetFtpConnection(_T("ftp.microsoft.com"));

//
CFtpFileFindfinder(pConnect);

//startlooping
BOOLbWorking=finder.FindFile(_T("*"));

while(bWorking)
{
bWorking=finder.FindNextFile();
_tprintf_s(_T("%s "),(LPCTSTR)finder.GetFileURL());
}
}
catch(CInternetException*pEx)
{
TCHARsz[1024];
pEx->GetErrorMessage(sz,1024);
_tprintf_s(_T("ERROR!%s "),sz);
pEx->Delete();
}

//iftheconnectionisopen,closeit
if(pConnect!=NULL)
{
pConnect->Close();
deletepConnect;
}

2. 如何非同步讀取FTP

一:開發背景
由於需要對多個伺服器發布大的數據包,所以自己在LINUX用C語言,開發了一個傳送器工具。因為上傳時需要支持斷點續傳,所以自己參考ftp-rfc959和一些文章開發了這個支持斷點續傳的上傳工具。整個工具分兩部分開發的:一是支持斷點續傳的Ftp工具,包含下載和上傳功能。二是同時對多個伺服器發布不同數據包的傳送器工具。本文只是對斷點續傳的商船和下載作探討。

二:實現
其實Ftp上傳下載的實現很簡單,首先Ftp伺服器端要支持文件的定位,
然後就是通過建立的Socket用Ftp伺服器命令和伺服器交互.
有些也可以通過Socket做自己的客戶端和伺服器端,但是有些伺服器是自己能管理控制的,而且原來自己也寫過一些這樣C/S模式的工具,簡單消息的傳送接收還不錯。
但用來傳輸文件效率很低,比文件傳送協議FTP(File Transfer Protocol)差的太多。 利用Ftp的服務端可以省去伺服器端的開發,而且可以向任何開放Ftp服務的伺服器上傳送文件,可以不考慮對方安裝的
是什麼的操作系統。

三:FTP
文件傳送協議 FTP 只提供文件傳送的一些基本的服務,它使用 TCP 可靠的運輸服務。FTP 的主要功能是減少或消除在不同操作系統下處理文件的不兼容性。
FTP 使用客戶伺服器方式。
一個 FTP 伺服器進程可同時為多個客戶進程提供服務。FTP的伺服器進程由兩大部分組成:一個主進程,負責接受新的請求;另外有若干個從屬進程,負責處理單個請求。
A、通常的方式:
控制連接在整個會話期間一直保持打開,FTP 客戶所發出的傳送請求通過控制連接發送給控制進程,但控制連接並不用來傳送文件,實際用於傳輸文件的是「數據連接」。
控制進程在接收到 FTP 客戶發送來的文件傳輸請求後就創建一個「數據傳送進程」和一個「數據連接」,並將數據連接連接到「數據傳送進程」,數據傳送進程實際完成文件的傳送,在傳送完畢後關閉「數據傳送連接」並結束運行
當客戶進程向伺服器進程發出建立連接請求時,要尋找連接伺服器進程的熟知埠(21),同時還要告訴伺服器進程自己的另一個埠號碼,用於建立數據傳送連接。接著,伺服器進程用自己傳送數據的熟知埠(20)與客戶進程所提供的埠號碼建立數據傳送連接。

B、 被動模式:
FTP客戶端發出的連接請求,一般通過伺服器的21號埠建立控制連接,專門用來傳輸一些字元串命令和響應信息。控制命令通道一定是由客戶端向伺服器的連接(默認的埠是21,也可以指定埠,這要看伺服器的設置)。
PASV:通過控制通道通過發送PASV 伺服器命令到 FTP伺服器。請求建立被動模式數據連接通道。 (客戶端的命令 passive)
伺服器返回連接的信息(227 Entering Passive Mode (70,0,10,62,120,18) )地址和埠。埠=最後第二位乘256再加上最後一位(120*256+18)。(注意埠設為0的情況) 如: *f_port = atoi(port_1) * 256 + atoi(port_2);
伺服器端和客戶端身份轉換,原客戶端在本地建立監聽,監聽來自原伺服器遠端的連接請求建立數據連接通道。
四、 實現方法:
A、下載:
1、向伺服器發送「REST + 本地文件長度」,告訴伺服器,客戶端要斷點下載了。這時伺服器還不知道客戶端要下載的文件名;
2、向伺服器發送"RETR + 文件名",通知伺服器要下載的文件名,這時伺服器開始定位文件指針讀文件並發送數據。
3、客戶端定位本地文件指針偏移到文件末尾;
4、兩端的准備工作都做完了以後,客戶端創建socket,以被動或非被動方式建立數據鏈接,循環調用recv接收文件數據並追加到本地文件末尾;

B、上傳:
1、獲取伺服器上和本地要上傳文件的同名文件大小;
2、向伺服器發送「APPE + 文件名」,通知伺服器,從數據通道發送給你的數據要附加到這個文件末尾。
3、定位本地文件指針,文件指針偏移到指定位置,這個位置與FTP伺服器上文件大小相同的位置。
4、從文件指針處讀數據並發送。

C、Ftp伺服器命令
我們平時使用的命令,大多是客戶端的。伺服器端的命令可以參考下面:
命令 描述
ABOR 中斷數據連接程序 ACCT <account> 系統特權帳號
ALLO <bytes> 為伺服器上的文件存儲器分配位元組 APPE <filename> 添加文件到伺服器同名文件
CDUP <dir path> 改變伺服器上的父目錄 CWD <dir path> 改變伺服器上的工作目錄
DELE <filename> 刪除伺服器上的指定文件 HELP <command> 返回指定命令信息 LIST <name> 如果是文件名列出文件信息,如果是目錄則列出文件列表 MODE <mode> 傳輸模式(S=流模式,B=塊模式,C=壓縮模式)
MKD <directory> 在伺服器上建立指定目錄 NLST <directory> 列出指定目錄內容
NOOP 無動作,除了來自伺服器上的承認 PASS <password> 系統登錄密碼
PASV 請求伺服器等待數據連接 PORT <address> IP 地址和兩位元組的埠 ID PWD 顯示當前工作目錄 QUIT 從 FTP 伺服器上退出登錄
REIN 重新初始化登錄狀態連接 REST <offset> 由特定偏移量重啟文件傳遞
RETR <filename> 從伺服器上找回(復制)文件 RMD <directory> 在伺服器上刪除指定目錄
RNFR <old path> 對舊路徑重命名 RNTO <new path> 對新路徑重命名
SITE <params> 由伺服器提供的站點特殊參數 SMNT <pathname> 掛載指定文件結構
STAT <directory> 在當前程序或目錄上返回信息 STOR <filename> 儲存(復制)文件到伺服器上
STOU <filename> 儲存文件到伺服器名稱上 STRU <type> 數據結構(F=文件,R=記錄,P=頁面)
SYST 返回伺服器使用的操作系統 TYPE <data type> 數據類型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系統登錄的用戶名
D、伺服器返回的部分數字代碼含義
125 Data connection already open; Transfer starting.
226 Transfer complete.
227 Entering Passive Mode (127,0,0,1,4,18).
230 User xxxxx logged in.
331 Password required for xxxxx.
425 Can』t open data connection.
226 Closing data connection.
200 return a state of TYPE or MODE commond
220 connection state
五、關於Socket
關於Socket編程有很多參考資料,這里不作詳細說明
Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面
Socket 是一個基本的通信機制Socket把復雜的TCP/IP協議族隱藏在Socket介面後面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協議.
Socket也具有一個類似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。
常用的Socket類型有兩種:
A、流式Socket(SOCK_STREAM):流式是一種面向連接的Socket,針對於面向連接的TCP服務應用。
B、數據報式Socket(SOCK_DGRAM):數據報式Socket是一種無連接的Socket,對應於無連接的UDP服務應用。
Socket的程序是一種C/S結構,分客戶端和伺服器端。
A、客戶端
– 初始化Socket
– 連接伺服器(connect),如果連接成功,這時客戶端與伺服器端的連接就建立了
– 客戶端發送數據請求,伺服器端接收請求並處理請求,然後把回應數據發送給客戶端
– 客戶端讀取數據,最後關閉連接,一次交互結束。
B、伺服器端
- 初始化Socket
- 埠綁定(bind)
- 監聽(listen)埠
- 調用accept阻塞,等待客戶端連接
在這里我們使用的就是面向連接的流式Socket,只編寫客戶端的程序。

六、代碼:
下面僅提供一個編譯過並在使用中的函數簡單的說明其實現原理,
需要有一點C語言和Linux/UNIX的socket編程基礎即可理解。
只是建立連接和傳輸部分的一個函數。當文件傳出結束或斷開時,
可以調用檢查函數看是否成功,位元組是否正常等,如果不正常結束,
可以再次循環調用它並定為伺服器文件的位元組,繼續傳輸。
其他的控制和功能都在其他函數中實現。為移植方便使用標准C語法符合C89標准。
code:
/*****************************************************************
* FileName: uftt_ver5.c *
* Company: algorithmics china lib Co.,Ltd. *
* Author: G.L.Zhang --- zglcl008 *
* Time: [2006-12-20] *
* Description: uninterrupted file transfers tools *
*****************************************************************/

int f_file_trans(const char *ft_addr, int ft_port, const char *ft_usr,const char *ft_pwd, const char *ft_opt, const char *ft_src, char *ft_obj, int ft_flg)
{
int cmd_sock = -1;
int dat_sock = -1;
int stream_sock= -1;
int dat_port = 0;
char dat_buffer[1024*5];
struct sockaddr_in f_server;
struct sockaddr_in f_datasvr;
unsigned char *pasv_ip = NULL;
unsigned char *pasv_port = NULL;
unsigned int len_addr = 0;
long rc_size = 0;
/* long svr_file_size = 0; */
long file_size = 0;
int rc = 0;
if (ft_addr == NULL || ft_usr == NULLft_pwd == NULL ||
ft_opt == NULL || ft_src == NULL || ft_obj == NULL ||
ft_port == 0 || ft_flg < 0) {
err_quit("--- file transfers parameter error");
}
/* get ftp commomd socket */
if ((cmd_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("cmmond socket");
err_quit("--- command sock error");
}

bzero(&f_server, sizeof(f_server));
f_server.sin_family = AF_INET;
f_server.sin_port = htons(ft_port);
f_server.sin_addr.s_addr = inet_addr(ft_addr);

if (connect(cmd_sock, (struct sockaddr *)&f_server, sizeof(f_server)) < 0) {
perror("connect");
err_quit("--- command sock error");
}
rc = uftt_cmd(dat_buffer, cmd_sock, NULL);
if (rc == 220)
printf("-1- %d OK\n", rc);
else
printf("-1- %d ERR\n", rc);

rc = uftt_cmd(dat_buffer, cmd_sock,"USER %s",ft_usr);
if (rc == 331)
printf("-2- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"PASS %s",ft_pwd);
if (rc == 230)
printf("-3- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "TYPE I");
if (rc == 200)
printf("-41- %d OK\n", rc);
else
printf("-41- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "MODE S");
if (rc == 200)
printf("-42- %d OK\n", rc);
else
printf("-42- %d ERR\n", rc);

memset(dat_buffer, ''\0'', sizeof(dat_buffer));
rc = uftt_cmd(dat_buffer, cmd_sock, "PASV");
if (rc == 227)
printf("-5- %d OK\n", rc);
else
printf("-5- %d ERR\n", rc);
#ifdef ZGL_DEBUG
printf("-5- %d %s\n", rc, dat_buffer);
#endif
/* get passive port */
dat_port = 0;
if ((rc = get_svr_port(dat_buffer, (int *)&dat_port)) < 0)
err_quit("data stream port error");
#ifdef ZGL_DEBUG
printf("--- pasive port=[%d]\n", dat_port);
#endif
if ((dat_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("data socket");
err_quit("--- data sock error");
}
len_addr = sizeof(f_datasvr);
bzero(&f_datasvr, sizeof(f_datasvr));
rc = getsockname(cmd_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
f_datasvr.sin_port = htons(dat_port);
/* 0=all port or appoint port TEST OK ***
f_datasvr.sin_port = htons(dat_port);
f_datasvr.sin_port = 0;
*/
if (bind(dat_sock,(struct sockaddr *)&f_datasvr,len_addr) == -1)
err_sys("--- data sock bind error");
if (listen(dat_sock,1) == -1)
err_sys("--- data sock bind error");
rc = getsockname(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
pasv_ip = (unsigned char *)&f_datasvr.sin_addr;
pasv_port = (unsigned char *)&f_datasvr.sin_port;
rc = uftt_cmd(dat_buffer, cmd_sock,"PORT %d,%d,%d,%d,%d,%d",pasv_ip[0],
pasv_ip[1], pasv_ip[2], pasv_ip[3], pasv_port[0], pasv_port[1]);
if (rc == 200)
printf("-6- %d OK\n", rc);
else
printf("-6- %d ERR\n", rc);

/* get RETR put STOR append APPE */
if (ft_flg == 0) {
rc = uftt_cmd(dat_buffer, cmd_sock, "STOR %s", ft_obj);
}
else if (ft_flg > 0){
rc = uftt_cmd(dat_buffer, cmd_sock, "APPE %s", ft_obj);
}
if (rc == 150)
printf("-7- %d OK\n", rc);
else
printf("-7- %d ERR\n", rc);
stream_sock = accept(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
if (stream_sock < 0)
err_sys("--- stream socket error");
rc_size = f_put_file(stream_sock, ft_src, ft_obj, ft_flg, file_size);
/* do without ***
rc = uftt_cmd(dat_buffer, dat_sock,"QUIT");
printf("-8- %d \n", rc);
*/
close(stream_sock);
close(dat_sock);
rc = uftt_cmd(dat_buffer, cmd_sock,"QUIT");
if (rc == 226)
printf("-9- %d OK\n", rc);
else
printf("-9- %d ERR\n", rc);
close(cmd_sock);
return rc_size ;
}

3. 在MFC ftp下載文件的程序中 怎樣使用Getfile()下載文件,在遠程路徑中使用的是URL地址 還是其他什麼

請注意第一個參數不支持路徑,只支持文件名。下載某個子目錄下的文件,需要先用SetCurrentDirectory()進入該文件夾

4. 怎樣利用WinInet技術開發FTP客戶端程序

摘要:WinInet是微軟MFC類庫提供的Win32Internet擴展介面,利用WinInet開發人員可以方便地編寫出Internet客戶端程序。本文主要闡述利用WinInet在VC 2005中實現FTP客戶端程序的方法。相對於通常採用的IE瀏覽器,本FTP客戶端程序更加安全可靠。

關鍵詞:MFC;WinInet;FTP客戶端程序;VC 2005

一、WinInet概述

為了開發Internet客戶端程序,微軟的MFC類庫提供了專門的Win32Internet擴展介面,即WinInet。WinInet提供了Internet會話類CInternetSession、Internet連接類CInternetConnection、Internet文件類CInternetFile、Internet文件操作類CFileFind、Internet通用異常類CInternetException等類。WinInet為HTTP、FTP和Gopher提供了統一的函數集,用戶使用這些類可以大大簡化針對HTTP、FTP等協議的編程,特別是客戶端的編程。

二、建立FTP客戶端程序的步驟

FTP客戶端程序首先要建立與伺服器的連接,這需要一個CInternetSession和CFtpConnection對象,但並不需要直接創建CFtpConnection對象,而是通過調用CInternetSession::GetFtpConnection來實現;然後通知FTP伺服器改變目錄到當前服務目錄,通過CFtpConnection::SetCurrentDirectory實現;讀寫伺服器中的數據,必須創建一個CFtpFileFind的實例;找到第一個文件,如果文件沒找到返回FALSE,通過CFtpFileFind::FindFile實現;循環找下一個文件,如果文件沒找到返回FALSE,通過CFtpFileFind::FindNextFile實現;最後打開找到的文件進行相應的操作。

三、建立FTP客戶端程序的實例

1.功能描述

本FTP客戶端程序實現如下功能:通過用戶名、密碼(只要是合法的用戶名、密碼均可)登錄到指定的FTP伺服器,在文件列表框中列出FTP伺服器當前目錄所在的文件和目錄,然後以「另存為」對話框實現對選定文件的下載功能。

2.設計

(1)在VisualStudio2005創建一個名為FTPClient項目

項目類型:開發語言為VisualC 的基於對話框的MFC應用程序,設計對話框模板如圖1所示。

圖1FTPClient對話框模板

(2)為各控制項添加變數

為「FTP伺服器地址」文本框添加Cstring類型的變數m_strFTPServer;為「埠」文本框添加UINT類型的變數m_nFTPPort;為「用戶名」文本框添加Cstring類型的變數m_strUserName;為「密碼」文本框添加Cstring類型的變數m_strPassword,其Password屬性為TRUE;為「下載目錄」文本框添加Cstring類型的變數m_strFTPDirectory;為「下載目錄文件列表」列表框控制項添加CListBox類型的變數m_listFiles;為「連接」按鈕添加Cbutton類型的變數m_bnConnect;為「下載文件」按鈕添加Cbutton類型的變數m_bnDownloadFile。

3.實現

(1)建立與FTP伺服器的連接

為此需要在對話框類(FTPClientDlg.h)中添加CInternetSession類的對象m_Session和CFtpConnection對象指針m_pConnection兩個變數。為使程序可使用WinInet類,需要在stdafx.h中加入一個對afxinet.h和afx.h的包含。建立連接主要是通過單擊對話框中的「連接」按鈕來實現的(調用FTPClientDlg.cpp中的CFTPClientDlg::OnBnClickedButtonconnect()),其代碼如下。

voidCFTPClientDlg::OnBnClickedButtonconnect()

{

UpdateData(TRUE);//從對話框中獲取數據

if(!m_pConnection)//進行連接

{

if(m_strFTPServer!="")

{

//利用Internet對話對象m_Session打開一個FTP連接

m_pConnection=m_Session.GetFtpConnection(m_strFTPServer,m_strUserName,m_strPassword,m_nFTPPort);

if(m_pConnection)

{

//如果連接成功,則獲取當前目錄

m_pConnection->GetCurrentDirectory(m_strFTPDirectory);

//將「連接」按鈕改為「斷開連接」按鈕

m_bnConnect.SetWindowText(_T("斷開連接"));

LoadListofFtpFiles();//獲取文件列表

//FTP已連接,「下載文件」按鈕使能

m_bnDownloadFile.EnableWindow(TRUE);

UpdateData(FALSE);//更新對話框數據

}

}

}

else//斷開連接

{

m_pConnection->Close();//斷開連接並刪除連接對象

deletem_pConnection;

m_pConnection=NULL;//重置連接對象指針為NULL

//將「斷開連接」按鈕改為「連接」按鈕

m_bnConnect.SetWindowText(_T("連接"));

m_strFTPDirectory="";//重置目錄

m_listFiles.ResetContent();//清空列表框

//FTP斷開連接,「下載文件」按鈕Disable

m_bnDownloadFile.EnableWindow(FALSE);

UpdateData(FALSE);//更新對話框數據

}

}

BOOLCFTPClientDlg::OnInitDialog()

{

Cdialog::OnInitDialog();

…//省略原有代碼

//TODO:在此添加額外的初始化代碼

//設置默認的FTP伺服器名(IP)、埠、用戶名(匿名)和登錄密碼,目錄

m_strFTPServer=_T("192.168.0.1");//設置FTP的IP

m_nFTPPort=21;//設置FTP埠:默認的埠是21

m_strUserName=_T("user1");//設置登錄用戶名,默認的是匿名:user1

m_strPassword=_T("user1");//設置登錄密碼:user1

m_listFiles.ResetContent();//清空文件目錄列表

m_pConnection=NULL;//初始狀態FTP未連接,FTP連接類的指針變數初始化為空

//FTP未連接,「下載文件」按鈕Disable

m_bnDownloadFile.EnableWindow(FALSE);

UpdateData(FALSE);//交換數據,對話框顯示初始化內容

returnTRUE;//除非將焦點設置到控制項,否則返回TRUE

}

voidCFTPClientDlg::OnClose()

{

m_Session.Close();//在對話框關閉時關閉Internet連接

Cdialog::OnClose();

}

(2)讀FTP伺服器中的文件和目錄到列表框中

該功能是通過FTPClientDlg.cpp中的CFTPClientDlg::LoadListofFtpFiles(void)來實現的,其代碼如下。

voidCFTPClientDlg::LoadListofFtpFiles(void)

{

m_listFiles.ResetContent();//清空列表框

//構建一個FTP文件操作類對象,同時把FTP連接指針傳遞給該對象,

//打開一個文件查找對話

CFtpFileFindfFiles(m_pConnection);

CstringstrFileName;//用來保存文件名

BOOLbMoreFiles;//用來設置文件搜索狀態

//利用默認的方法找到第一個文件,同時找到文件列表

bMoreFiles=fFiles.FindFile(NULL);

while(bMoreFiles)//文件搜索,直到最後一個文件

{

bMoreFiles=fFiles.FindNextFile();//查找下一個文件

strFileName=fFiles.GetFileName();//獲取該文件名

if(fFiles.IsDirectory())//若為目錄,則在名後加一個標志

strFileName ="<DIR>";

m_listFiles.AddString(strFileName);//將文件名添加到列表框中

}

fFiles.Close();//關閉文件查找對話框

}

(3)下載FTP伺服器中的文件

下載文件是通過單擊對話框中的「下載文件」按鈕來實現的(調用FTPClientDlg.cpp中的CFTPClientDlg::OnBnClickedButtondownloadfile()),其具體實現是利用CFileDialog的保存功能來完成文件下載的,其主要代碼如下。

voidCFTPClientDlg::OnBnClickedButtondownloadfile()

{

UpdateData(TRUE);//從對話框中獲取數據

m_listFiles.GetText(m_listFiles.GetCurSel(),m_strFile);

//將列表框選中的項的值賦給m_strFile(選中的文件或目錄)

if(m_strFile!="")

{

if(m_strFile.Right(5)=="<DIR>")//判斷用戶選擇的是否目錄

MessageBox(_T("無法下載目錄!"));//如果是目錄,報錯

else

{

//打開文件對話框,詢問下載位置

CFileDialogfiledlg(FALSE,NULL,m_strFile);

if(filedlg.DoModal()==IDOK)

{

//確定地址後開始下載文件

if(!m_pConnection->GetFile(m_strFile,filedlg.GetFileName()))

MessageBox(_T("無法下載文件!"));//下載出錯

else

MessageBox(_T("文件下載完畢!"));//下載成功

}

}

}

}

4.最終實現界面,如圖2所示。

圖2程序運行界面

四、結束語

只要安裝.NET2.0且FTP伺服器能提供正常的服務,本客戶端程序可以運行在WindowsXP(SP2)、Windows2000pro/server下。若FTP伺服器沒有正常運行,則無法連接,提示:「與伺服器的連接被重置」。利用WinInet不僅可以實現FTP客戶端程序,還可以方便地編寫HTTP等其它客戶端程序。

參考文獻:

[1]VisualC#.NET面向程序設計教程趙衛偉機械工業出版社2006年5月第1版

[2]VisualC .NET應用編程150例王興晶電子工業出版社2003年8月第1版

[3]MSDN(msdn.microsoft.com)

Tags:
發布:crazyapple

5. mfc怎麼實現上傳文件到ftp客戶端並用進度條顯示傳輸進度

創建一個線程,把this傳進去,在新線程(其實就是個函數)里搞個循環,讀取文件,設置進度,發送刷新進度條消息,直到讀取完畢,break。

6. 如何在MFC中實現同FTP的連接,如何在MFC主窗口的源文件中寫OnConnect()函數

GetFtpConnection()函數

CFtpConnection* CIternetsession::GetFtpConnection(LPCTSTR pstrServer, LPCTSTR pstrUserName, LPCTSTR pstrPassword, INTERNET_PORT nPort, BOOL bPassive);

try
{
//CFtpConnection *m_FtpConnection;
//CInternetSession m_InternetSession;
m_FtpConnection = m_InternetSession.GetFtpConnection(*strServer,*strUserName,*strPwd,*nPort,TRUE);
}
catch(CInternetException* e)
{
TCHAR szErr[1024];
e->GetErrorMessage(szErr, 1024);
TRACE(szErr);
AfxMessageBox(szErr);
e->Delete();
}

熱點內容
php數組計數 發布:2025-01-10 14:23:03 瀏覽:473
s盒演算法 發布:2025-01-10 14:16:42 瀏覽:640
c語言用二分法求方程 發布:2025-01-10 14:15:45 瀏覽:219
廣場舞加密 發布:2025-01-10 14:13:21 瀏覽:519
網路密碼顯示低安全性是什麼意思 發布:2025-01-10 14:11:49 瀏覽:780
恥辱2博士保險箱密碼是多少 發布:2025-01-10 14:11:41 瀏覽:98
如何把伺服器搭在自己電腦 發布:2025-01-10 14:10:57 瀏覽:584
水晶可以存儲 發布:2025-01-10 14:09:35 瀏覽:388
一級腳本號 發布:2025-01-10 14:08:06 瀏覽:533
知乎冷數據存儲 發布:2025-01-10 14:07:10 瀏覽:603