领悟旧事

Learned Helplessness
分类新闻>>生活领悟>>
XE10 C++Builder采用FTP上传下载文件
来源:http://www.xx0594.com/
时间:2023-8-12
作者:  浏览人数:361
/采用FTP上传文件sFile为本地文件,如sFile="Reading.db";sUrlDir为服务器文件,包含路径,如"/upload/MyReading.db"
//如果目标sUrlDir不包含路径,将直接传到根目录下。sToDir="MyReading.db"。
//返回”OK“表示无错误,否则返回错误信息。
//调用例子,上传: s=FtpFile(”local\\file.c","Http://www.www.com/upload/upload_file.c";,"upload")

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;
}
//--------------------------------------------------------------------------- 
 

关闭窗口
 访问量:519310
任何第三方若要引用、转摘本站信息,均需征得本站书面同意,否则视为侵权。本站信息为个人观点,若因引用本站信息而产生的任何情况,均与本站无关。Email:linmutou@163.com
闽ICP备14017840号-2