AnsiString FtpFile(AnsiString sFile,AnsiString sUrlDir,AnsiString actType)
{
AnsiString sFTP="OK";
sUrlDir=StringReplace(sUrlDir,L"Http://www.www.com/","", TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
if(!TFile::Exists(sFile) && actType.LowerCase()=="upload") return 0;
AnsiString sServeDir="/",sServeFile;
if(sUrlDir.AnsiPos("/")>0){
sServeFile=ExtractFileName(sUrlDir);//获取文件名 C:/ucods/d.doc-->d.doc
sServeDir=StringReplace(sUrlDir, "/"+sServeFile,"", TReplaceFlags() <<rfReplaceAll<< rfIgnoreCase);//这是路径
}else{
sServeFile = sUrlDir;
}
TIdFTP *IdFTP=new TIdFTP();
IdFTP->Host = "112.1.1.1"; //FTP服务器地址
IdFTP->Passive=true;//这是使用被动连接。如果不用这句,会出现“server cannot accept argument”的错误。
IdFTP->Username= "userName"; //FTP服务器用户名
IdFTP->Password = "passwords"; //FTP服务器密码
IdFTP->Port=21;
try{
Application->ProcessMessages();
IdFTP->Connect(); //连接到ftp
IdFTP->ChangeDir(sServeDir); //进入到client子目录
IdFTP->TransferType= ftBinary;
if(actType.LowerCase()=="upload")
IdFTP->Put(sFile,sServeFile);
if(actType.LowerCase()=="download"){
//因为FTP下载时无法获取文件大小,所以在此设置。
//DownLoad_ProgressBar->Max =AWorkCountMax将无法正常工作。
DownLoad_ProgressBar->Max =IdFTP1->Size(sServeFile);
IdFTP->Get(sServeFile,sFile,true); //后面的参数true,是覆盖模式,如果没有,将无法下载,提示文件已存在。
}
IdFTP->Disconnect();
}catch(Exception &ee){
sFTP=ee.Message;
}
delete IdFTP;
return sFTP;
}
//---------------------------------------------------------------------------
//如果要显示进度,上面代码不能用TIdFTP *IdFTP=new TIdFTP();而是要直接用控件来代替。
//这是显示上传或下载的进度。
void __fastcall TTabbedForm::IdFTP1Work(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount)
{
Application->ProcessMessages();//注意,要处理消息,否则无法显示进度。
DownLoad_ProgressBar->Value= AWorkCount;
}
//---------------------------------------------------------------------------
void __fastcall TTabbedForm::IdFTP1WorkBegin(TObject *ASender, TWorkMode AWorkMode,
__int64 AWorkCountMax)
{
//因为FTP下载时无法获取文件大小,如果文件大小在函数中设置,不在此设置。
//TWorkMode AWorkMode的值如下:
//wmRead: 下载;
//wmWrite: 上传;
if(AWorkMode == wmWrite)DownLoad_ProgressBar->Max = AWorkCountMax;
}
//---------------------------------------------------------------------------
void __fastcall TTabbedForm::IdFTP1WorkEnd(TObject *ASender, TWorkMode AWorkMode)
{
DownLoad_ProgressBar->Visible=false;
DownLoad_ProgressBar->Value=0;
DownLoad_ProgressBar->Max = 1;
}
//---------------------------------------------------------------------------