ftp下載實現
沒什麼技術難度.僅存之以備後用.
//////////////////////////////////////////////////////////////////////////////////
//DownLoadFile //
//功能:下載指定檔案 //
//引數說明: //
//ftpurl: Ftp連結地址 //
//acc: 登陸ftp的帳號 //
//psw: 登陸ftp的密碼 //
//farfilename: 要下載的遠端檔案 //
//localpath: 本地用於儲存檔案的目錄 //
//說明:指定檔案要包含路徑和檔名,路徑中請使用"\\",不要用"/"做為分割符 //
//////////////////////////////////////////////////////////////////////////////////.
bool CFtpTestDlg::DownLoadFile(char *ftpurl, char * acc,
char * psw, char * farfilename, char * localpath)
{
//建立InternNet會話
CInternetSession sess(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
CFtpConnection* pConnect = NULL;
CFtpFileFind *pftpfinder;
try
{
//CString m_strFtpSite = "192.168.0.60";
pConnect = sess.GetFtpConnection(ftpurl,acc,psw);
pftpfinder = new CFtpFileFind(pConnect);
BOOL bWorking = pftpfinder->FindFile(farfilename);
if(bWorking)
{
CString localfilename(localpath);
if(localfilename.Right(1)!="\\")
localfilename += "\\";
localfilename += ::PathFindFileName(farfilename);
if(!pConnect->GetFile(farfilename,localfilename,0))
{
CString buf;
buf.Format("下載檔案出錯;filename:%s,curlocaldir:%s",farfilename,localfilename);
Log(buf.GetBuffer());
}
}
// LoopDownloadDir(pConnect,pftpfinder,farpath);
}
catch (CInternetException* pEx)
{
TCHAR sz[1024];
pEx->GetErrorMessage(sz, 1024);
printf("ERROR! %s\n", sz);
pEx->Delete();
}
if(pftpfinder)
delete pftpfinder;
return true;
}
//////////////////////////////////////////////////////////////////////////////////
//DownLoadAllDirFile //
//功能:下載指定資料夾下的內容 //
//引數說明: //
//ftpurl: Ftp連結地址 //
//acc: 登陸ftp的帳號 //
//psw: 登陸ftp的密碼 //
//farpath: 要下載的遠端目錄 //
//localpath:本地用於儲存檔案的目錄 //
//////////////////////////////////////////////////////////////////////////////////.
bool CFtpTestDlg::DownLoadAllDirFile(char *ftpurl,
char * acc, char * psw, char * farpath, char * localpath)
{
//記錄本地資料夾和要下載的遠端資料夾
m_strLocalDir = localpath;
m_strFarDir = farpath;
//建立InternNet會話
CInternetSession sess(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
CFtpConnection* pConnect = NULL;
CFtpFileFind *pftpfinder;
try
{
//CString m_strFtpSite = "192.168.0.60";
pConnect = sess.GetFtpConnection(ftpurl,acc,psw);
pftpfinder = new CFtpFileFind(pConnect);
LoopDownloadDir(pConnect,pftpfinder,farpath);
}
catch (CInternetException* pEx)
{
TCHAR sz[1024];
pEx->GetErrorMessage(sz, 1024);
printf("ERROR! %s\n", sz);
pEx->Delete();
}
if(pftpfinder)
delete pftpfinder;
return true;
}
//////////////////////////////////////////////////////////////////////////////////
//LoopDownloadDir() //
//功能:遞迴下載目錄內容 //
//引數說明: //
//pConnect: Ftp連結指標 //
//pftpfinder: ftp檔案查詢指標 //
//dirpath: 遞迴目錄 //
//////////////////////////////////////////////////////////////////////////////////.
bool CFtpTestDlg::LoopDownloadDir(CFtpConnection* pConnect,
CFtpFileFind * pftpfinder,char * dirpath)
{
//當前本地資料夾
CString curlocaldir = m_strLocalDir;
CString strbuf(dirpath);
CString strbuf2 = strbuf.Right(strbuf.GetLength()-m_strFarDir.GetLength());
if(strbuf2.Left(1) == "\\") //去除最左邊的"\\"
strbuf2 =strbuf2.Right(strbuf2.GetLength()-1);
curlocaldir = m_strLocalDir;
if(curlocaldir.Right(1) != "\\")
curlocaldir += "\\";
curlocaldir += strbuf2;
////但前遠端資料夾
//CString curfardir = m_strFarDir;
//if(m_strFarDir.Right(1) != "\\")
// m_strFarDir+="\\";
//curfardir += dirpath;
//if(strlen(dirpath))
// curlocaldir= m_strLocalDir + "\\" + dirpath;
//查詢任意檔案
CString allfile(dirpath);
if(allfile.Right(1) != "\\")
allfile += _T("\\");
allfile += "*.*";
BOOL bWorking = pftpfinder->FindFile(allfile);
while(bWorking)
{
bWorking = pftpfinder->FindNextFile();
CString filename = pftpfinder->GetFileName();
Log("filename:%s",filename.GetBuffer());
if(!pftpfinder->IsDirectory()) //檔案,下載
{
Log("File :%s",filename.GetBuffer());
//遠端檔案全名=遠端目錄+"\\"+檔名稱
CString farfilename(dirpath);
if(farfilename.Right(1) != "\\")
farfilename+="\\";
farfilename += filename;
//當地檔案全名=當地目錄+"\\"+檔名稱
CString localfilename=curlocaldir ;
if(localfilename.Right(1) != "\\")
localfilename+="\\";
localfilename += filename;
if(!pConnect->GetFile(farfilename,localfilename,0))
{
CString buf;
buf.Format("下載檔案出錯;filename:%s,curlocaldir:%s",filename,curlocaldir);
Log(buf.GetBuffer());
}
}
else if(!pftpfinder->IsDots()) //子目錄,遞迴下載
{
//定位當地子資料夾
CString localsubdir = curlocaldir;
if(localsubdir.Right(1) != "\\")
localsubdir+="\\";
localsubdir += filename;
//定位遠端子資料夾
CString farsubdir = dirpath;
if(farsubdir.Right(1) != "\\")
farsubdir+="\\";
farsubdir += filename;
//查詢並新增本地資料夾
CFileFind finder;
if(finder.FindFile(localsubdir)==FALSE)
{
if(!CreateDirectory(localsubdir,NULL))
Log("Create dir flase! :%s",localsubdir);
}
finder.Close();
Log("Dir :%s",localsubdir.GetBuffer());
LoopDownloadDir(pConnect,pftpfinder,farsubdir.GetBuffer());
bool bfint = pftpfinder->FindFile(allfile);
//重新定位本層查詢 //這裡應該有更好的實現方法
while(bfint)
{
bfint = pftpfinder->FindNextFile();
if(pftpfinder->GetFileName() == filename)
break;
}
}
}
return true;
}