用到临界区 保护写日志的函数;

递归函数 删除目录下的所有文件;

循环创建或判断FTP的目录;

可改进的地方:循环压缩深层次目录的所以文件; 实现断点续传,或断点下载;

  1. {*******************************************************************************
  2. Copyright (C), 2014-2020, aicaipiao
  3. File name: UFtpContentThd.pas
  4. Author: lipingchen
  5. Version:
  6. Date: 20140929
  7. Description:
  8. Others:
  9. Function List:
  10. 1.Date:2015.03.31
  11. Author: liping.chen
  12. Modification: 解压缩,FTP遍历创建新目录,上传
  13. *******************************************************************************}
  14. unit UFtpContentThd;
  15.  
  16. interface
  17.  
  18. uses
  19. Classes,Forms,Dialogs,SysUtils,Windows,VCLZip,VCLUnZip,IdFTP,IdFTPList,fClientDataModule,
  20. IdFTPListParseWindowsNT,IdAllFTPListParsers,DateUtils,SyncObjs;
  21.  
  22. type
  23. TLogMsgProc = procedure (AMsg: string; const blnIsErrorMsg: boolean = False; const BoolSaveToFile: Boolean = True);
  24.  
  25. TFtpContentThd = class(TThread)
  26. private
  27. FStart_Date,FEnd_Date,FNextDate :TDateTime;// 获取起始时间\获取结束时间\增加分钟 计算出结束时间
  28.  
  29. FCount :Integer;
  30. FContent: wideString;
  31. protected
  32. ziper:TVCLZip;
  33. IdFTP: TIdFTP;
  34. FLogMsg: TLogMsgProc;
  35. Filename:string; //生成压缩文件名
  36. FMessage: string; //消息
  37. ZipUpLoadDir,ZipUpLoadDirTemp:string; //上传FTP的路径
  38. FDeptID:string; //出票点ID
  39. pub_Critical: TCriticalSection; //临界区
  40. //--------------
  41. procedure DoPostContent(var HasData: boolean);
  42. //定区间
  43. function Get_Bak_Date : Boolean; //获取时间段
  44. //取,存,压缩
  45. Function Get_ContentByDate(var HasData: boolean) : Boolean; // 根据推送的时间段,从票据打印表中取出数据获取,存为txt
  46. //上传
  47. Function UpLoad_Content_Zip :Boolean; //上传Zip包
  48. //更新
  49. Function Update_Content_Bak_Date : Boolean;
  50. public
  51. constructor Create(LogMsgProc: TLogMsgProc);
  52. procedure LogInfo(AMsg: string; const blnIsErrorMsg: boolean = False; const BoolSaveToFile: Boolean = True);
  53. destructor Destroy;override;
  54. function CreatFtpDir(UpLoadDir:string): Boolean; //遍历当前FTP文件夹, 创建新目录或更改路径
  55. function DeleteDirectory(NowPath: string): Boolean; // 循环删除整个目录下的所有文件包括文件夹
  56. function Zip(ZipMode,packSize:Integer;ZipFile,UnzipDir:string):Boolean;
  57. protected
  58. procedure Execute; override;
  59. end;
  60.  
  61. var
  62. FtpContentThd:TFtpContentThd;
  63. implementation
  64. uses
  65. UPubTypeVarCon,UFrmMain,UPubFuncProc;
  66.  
  67. { TFtpContentThd }
  68.  
  69. constructor TFtpContentThd.Create(LogMsgProc: TLogMsgProc);
  70. var
  71. sFilePath:string;
  72. begin
  73. sFilePath:=ExtractFilePath(Application.ExeName);
  74. if sFilePath[Length(sFilePath)] <> '\' then sFilePath := sFilePath + '\';
  75. pub_UnZipFileSaveDir:=sFilePath+'PostContentRunLog\ConTxt';
  76. pub_ZipFileSaveDir:=sFilePath+ 'PostContentRunLog\ConZip';
  77.  
  78. if not DirectoryExists(pub_UnZipFileSaveDir) then //未压缩的文件保存路径
  79. CreateDir(pub_UnZipFileSaveDir);
  80. if not DirectoryExists(pub_ZipFileSaveDir) then //压缩包保存路径
  81. CreateDir(pub_ZipFileSaveDir);
  82. DeleteDirectory(pub_UnZipFileSaveDir); //每次打开先删除这两个目录下的所有文件
  83. DeleteDirectory(pub_ZipFileSaveDir);
  84. //此处要删除 上一次的txt和zip; 若改进为断点续传,可变更逻辑
  85.  
  86. try
  87. inherited Create(True);
  88. FreeOnTerminate := True;
  89. FLogMsg:=LogMsgProc;
  90. //FDeptID:='6';
  91. pub_Critical := TCriticalSection.create;
  92. ziper:=TVCLZip.Create(nil);
  93. IdFTP:=TIdFTP.Create;
  94. LogInfo('创建FTP上传线程成功!',true,true);
  95.  
  96. Resume;
  97. except
  98. on e:exception do
  99. begin
  100. FMessage:='创建FTP上传线程出错!'#+e.Message;
  101. LogInfo(FMessage,true,true);
  102. end;
  103. end;
  104. end;
  105.  
  106. procedure TFtpContentThd.Execute;
  107. var
  108. HasData: boolean;
  109. begin
  110. while not Terminated do
  111. begin
  112.  
  113. DoPostContent(HasData);
  114.  
  115. if HasData then
  116. Sleep()
  117. else
  118. Sleep(pub_FtpExecInterval * ); //等待中
  119. end;
  120. end;
  121.  
  122. {Zip用法:Zip(压缩模式,压缩包大小,压缩或解压文件,解压或压缩目录,TVCLZip控件)
  123. ZipMode0:压缩;为1:解压缩 PackSize0则不分包;否则为分包的大小 }
  124. function TFtpContentThd.Zip(ZipMode, packSize: Integer; ZipFile,
  125. UnzipDir: string): Boolean;
  126. begin
  127. if copy(UnzipDir,length(UnzipDir),)='\'then
  128. UnzipDir:=copy(UnzipDir,,length(UnzipDir)-);//去除目录后的'\'
  129. try
  130. ziper.DoAll:=False; //加此设置将对分包文件解压缩无效
  131. ziper.OverwriteMode:=Always; //总是覆盖模式
  132.  
  133. if PackSize<>0then //0则压缩成一个文件,否则压成多文件
  134. begin
  135. ziper.MultiZipInfo.MultiMode:=mmBlocks; //设置分包模式
  136. ziper.MultiZipInfo.SaveZipInfoOnFirstDisk:=True;//打包信息保存在第一文件中
  137. ziper.MultiZipInfo.FirstBlockSize:=PackSize; //分包首文件大小
  138. ziper.MultiZipInfo.BlockSize:=PackSize; //其他分包文件大小
  139. end;
  140. ziper.FilesList.Clear;
  141. ziper.ZipName:=ZipFile; //获取压缩文件名
  142. if ZipMode=0then //压缩
  143. begin
  144. ziper.FilesList.Add(UnzipDir+'\*.txt'); //添加压缩文件列表 设定为|*.txt文档,若需压缩全部可\*.*
  145. //ziper.
  146. Application.ProcessMessages;
  147. ziper.Zip;
  148. end else
  149. begin
  150. ziper.DestDir:=UnzipDir; //解压缩的目标目录
  151. ziper.UnZip; //解压缩
  152. end;
  153. Result:=True;
  154. except
  155. on ex:exception do
  156. begin
  157. Result:=False;
  158. FMessage := '文件解压缩异常'# + ex.Message;
  159. LogInfo(FMessage,True,True);
  160. end;
  161. end;
  162. end;
  163.  
  164. {遍历当前FTP文件夹, 创建新目录或更改路径}
  165. function TFtpContentThd.CreatFtpDir(UpLoadDir: string): Boolean;
  166. var
  167. CreatDirList: TStringList;
  168. i,j,flag:Integer;
  169. begin
  170. CreatDirList:=TStringList.Create;
  171. CreatDirList.Delimiter :='\';
  172. CreatDirList.DelimitedText :=UpLoadDir;
  173. for i := to CreatDirList.Count - do
  174. begin
  175. if CreatDirList[i]<>'' then
  176. begin
  177. flag:=;
  178. IdFTP.List;
  179. //ShowMessage(IntToStr(IdFTP.DirectoryListing.Count)); //默认uses idftplistParse异常;要添加IdFTPListParseWindowsNT,IdAllFTPListParsers单元
  180. for j := to IdFTP.DirectoryListing.Count- do //indy10要添加IdFTPListParseWindowsNT,IdAllFTPListParsers单元
  181. begin //介绍:http://blog.sunshow.net/2007/07/tidftp-directorylisting-usage/
  182. if IdFTP.DirectoryListing.Items[j].ItemType = ditDirectory then //要添加单元IdFTPList
  183. begin
  184. if IdFTP.DirectoryListing.Items[j].FileName = CreatDirList[i] then
  185. begin
  186. flag:=; //标志已经存在该目录
  187. Break;
  188. end;
  189. end;
  190. end;
  191. if flag= then
  192. IdFTP.MakeDir(CreatDirList[i]); //新创建文件夹
  193.  
  194. IdFTP.ChangeDir(CreatDirList[i]); //更改目录
  195. end;
  196.  
  197. //***以下DirList内容有空格,IndexOf(CreatDirList[i])识别不了;也不严谨***
  198. { if CreatDirList[i]<>'' then
  199. begin
  200. IdFTP.List(DirList,'',True);
  201. if (DirList.IndexOf(CreatDirList[i])=-1) then
  202. begin
  203. try
  204. IdFTP.MakeDir(CreatDirList[i]);
  205. except on ex:Exception do
  206. LogInfo('添加目录名:'+CreatDirList[i]+'出错,原因:'+ex.Message,True,True );
  207. end;
  208. try
  209. IdFTP.ChangeDir(CreatDirList[i]);
  210. except on ex:Exception do
  211. LogInfo('变更目录名:'+CreatDirList[i]+'出错,原因:'+ex.Message,True,True );
  212. end;
  213. end;
  214. end; }
  215.  
  216. //***以下忽略异常,懒虫写法,***
  217. { try
  218. IdFTP.ChangeDir(CreatDirList[i]);
  219. except
  220. IdFTP.MakeDir(CreatDirList[i]);
  221. IdFTP.ChangeDir(CreatDirList[i]);
  222. end;}
  223.  
  224. //***以下忽略异常,懒虫写法,***
  225. { try
  226. IdFTP.MakeDir(CreatDirList[i]);
  227. finally
  228. IdFTP.ChangeDir(CreatDirList[i]);
  229. end; }
  230.  
  231. end;
  232. CreatDirList.Free;
  233. Result :=True;
  234. end;
  235.  
  236. destructor TFtpContentThd.Destroy;
  237. begin
  238. //inherited; //继承会产生异常 为什么??
  239. ziper.Free;
  240. IdFTP.Free;
  241. pub_Critical.Free;
  242. try
  243. LogInfo('FTP上传线程终止',False,true);
  244. FtpContentThd.Terminate;
  245. WaitForSingleObject(FtpContentThd.Handle, );
  246. FtpContentThd := nil;
  247. except on ex:Exception do
  248. begin
  249.  
  250. end;
  251. end;
  252. end;
  253.  
  254. function TFtpContentThd.Get_Bak_Date: Boolean;
  255. var
  256. sql1 :string;
  257. count :integer;
  258. Now_Date :TDateTime;
  259. begin
  260. Result := True;
  261. Now_Date := StrToDateTime(FormatDateTime('YYYY/MM/DD hh:mm:ss',Now()));
  262. //获取时间段内的票面内容
  263. Sql1 := 'SELECT * FROM TICKET_CONTENT_BAK_DATE WHERE STATUS = 0';
  264. try
  265. try
  266. with ClientDataModule.orqry1 do
  267. begin
  268. SQL.Clear;
  269. SQL.Text := sql1;
  270. Open;
  271. First;
  272. count := RecordCount;
  273. if Count = then
  274. begin
  275. //临时增加一条数据,否则程序无法进行
  276. FMessage := '上传票面内容时,未找到相应上传区间。';
  277. LogInfo(FMessage,True);
  278. Result := False;
  279. Exit;
  280. end;
  281. // 获取相关信息
  282. FStart_Date := FieldByName('START_DATE').AsDateTime; // 获取起始时间
  283. FEnd_Date := fieldByName('END_DATE').AsDateTime; // 获取结束时间
  284. FNextDate := IncSecond(FEnd_Date,Pub_SecondInterval);
  285. Close;
  286. end;
  287. Now_Date := IncMinute(Now_Date,-Pub_Before_Minitue); //只取Now()前5分钟的数据;
  288. If FNextDate > Now_Date then
  289. begin
  290. Result := False;
  291. end;
  292. except on Ex:Exception do
  293. begin
  294. FMessage := '查找相应上传区间时,服务器断开或异常。';
  295. LogInfo(FMessage,True);
  296. Result := False;
  297. end;
  298. end;
  299. finally
  300.  
  301. end;
  302. end;
  303.  
  304. function TFtpContentThd.Get_ContentByDate(var HasData: boolean): Boolean;
  305. var
  306. sql1,s :string;
  307. s_TID,s_CheckNo :string;
  308. s_content,s_content_left,s_content_right :widestring;
  309. Msg :string;
  310. i : Integer;
  311. begin
  312. Result := True;
  313. Msg := '查找票面内容,如下区间:';
  314. Msg := Msg + Formatdatetime('YYYY-MM-DD hh:mm:ss',FStart_Date);
  315. Msg := Msg + ' -- ';
  316. Msg := Msg + Formatdatetime('YYYY-MM-DD hh:mm:ss',FEnd_Date);
  317. LogInfo(Msg);
  318. // 根据推送的时间段,从票据打印表中取出数据
  319. Sql1 := ' SELECT A.TID,A.CHECK_NO,B.CONTENT FROM TICKET_PRINT_HISTORY A,TICKET_CONTENT B ' +
  320. ' WHERE A.TID=B.TID ' +
  321. ' AND A.PRINT_TIME >= TO_DATE(' + Quotedstr(DateTimeToStr(FStart_Date)) + ',' + Quotedstr('yyyy-mm-dd hh24:mi:ss') + ')' +
  322. ' AND A.PRINT_TIME < TO_DATE(' + Quotedstr(DateTimeToStr(FEnd_Date)) + ',' + Quotedstr('yyyy-mm-dd hh24:mi:ss') + ')';
  323. //测试语句
  324. //sql1 := 'SELECT TID,CHECK_NO FROM TICKET_PRINT_HISTORY WHERE TID >= 39332133 AND TID<=39334764';
  325.  
  326. try
  327. try
  328. with ClientDataModule.orqry1 do
  329. begin
  330. try
  331. sql.Clear;
  332. SQL.Text := sql1;
  333. Open;
  334. First;
  335. FCount := RecordCount;
  336. if FCount > then
  337. begin
  338. HasData := True;
  339. LogInfo('开始解析票面内容。总数为: ' + IntToStr(FCount) + '条。');
  340. end
  341. else
  342. begin
  343. HasData := False;
  344. FMessage := '查找区间票面内容为空。';
  345. LogInfo(FMessage);
  346. Result := True;
  347. Exit;
  348. end;
  349. while not Eof do
  350. begin
  351. Try
  352. s_TID := FieldByName('TID').asstring;
  353. LogInfo('解析票面内容。票ID为:' + s_TID,False,True); //不需要写日志吧
  354. FContent := Trim(FieldByName('CONTENT').Asstring);
  355. //FContent := Trim(FieldByName('CHECK_NO').Asstring); //ss测试语句
  356. pub_Critical.Enter;
  357. try
  358. WriteLog(pub_UnZipFileSaveDir+'\' +s_TID+ '.Txt',FContent,True); //若存在该文件,覆盖模式
  359. finally
  360. pub_Critical.Leave;
  361. end;
  362. Next;
  363. except on Ex:Exception do
  364. begin
  365. FMessage := '解析单张票面内容时,出现异常。' + Ex.Message;
  366. LogInfo(FMessage,True);
  367. Result := False;
  368. Exit;
  369. end;
  370. end;
  371. end;
  372. Close;
  373. Except on Ex:Exception do
  374. begin
  375. Close;
  376. FMessage := '查找区间内票面内容时,服务器断开或异常。' + Ex.Message;
  377. LogInfo(FMessage,True);
  378. //获取数据时出现异常
  379. Result := False;
  380. end;
  381. end;
  382. end;
  383. Except on Ex:Exception do
  384. begin
  385. FMessage := '查找区间内票面内容时,服务器断开或异常。' + Ex.Message;
  386. LogInfo(FMessage,True);
  387. //获取数据时出现异常
  388. Result := False;
  389. end;
  390. end;
  391. finally
  392. end;
  393. end;
  394.  
  395. procedure TFtpContentThd.DoPostContent(var HasData: boolean);
  396. begin
  397. HasData := False;
  398. try
  399. //1、从数据库取得指定区间的数据,保存为多个txt,
  400. //2、当前文件夹的*.txt全部保存为zip
  401. //3、ftp上传到服务器
  402.  
  403. LogInfo('开始取区间');
  404. if not Get_Bak_Date then Exit;
  405. LogInfo('开始取区间内票面内容');
  406. //ss -------测试
  407. //FStart_Date:=Now();
  408. //FEnd_Date:=Now();
  409. if not Get_ContentByDate(HasData) then Exit;
  410.  
  411. DateTimeToString(Filename,'YYYYMMDD-HHMMSS',FStart_Date); //压缩包名称,以区间开始时间命名
  412. Filename:=Filename+'.zip';
  413.  
  414. LogInfo('执行压缩');
  415. if not Zip(,,pub_ZipFileSaveDir+'\'+Filename,pub_UnZipFileSaveDir) then //将abc.zip解压到路径,若不存在会自动创建目录的。
  416. begin //压缩时,若路径不存在,是否会创建;
  417. exit;
  418. end;
  419.  
  420. LogInfo('提交票面内容压缩包到文件服务器');
  421. DateTimeToString(ZipUpLoadDir,'YYYY\MM\DD\HH',Now); //压缩包上传路径
  422. if not UpLoad_Content_Zip then Exit;
  423. LogInfo('更新提交状态');
  424. if not Update_Content_Bak_Date then Exit;
  425. LogInfo('执行下一批数据');
  426. finally
  427.  
  428. end;
  429. end;
  430.  
  431. function TFtpContentThd.UpLoad_Content_Zip: Boolean;
  432. begin
  433. //发送
  434. Result:=False;
  435. with IdFTP do
  436. begin
  437. if not Connected then
  438. begin
  439. Username:=pub_FtpUsername;
  440. Password:=pub_FtpPassword;
  441. try
  442. Connect(pub_FtpHost,pub_FtpPort);
  443. except
  444. on e:exception do
  445. begin
  446. FMessage:='连接FTP服务器出错!'#+e.Message;
  447. LogInfo(FMessage,true,true);
  448. Exit;
  449. end;
  450. end;
  451. end;
  452. if Connected then
  453. begin
  454. if ZipUpLoadDirTemp<>ZipUpLoadDir then //上传保存的路径改变,则创建新目录或更改路径。
  455. begin
  456. ChangeDir(pub_ZipUpLoadRtDir); //先回到设定的根目录
  457. CreatFtpDir(ZipUpLoadDir); //遍历当前FTP文件夹, 创建新目录或更改路径
  458. end;
  459. try
  460. Put(pub_ZipFileSaveDir+'\'+Filename,Filename);
  461.  
  462. deletefile(PChar(pub_ZipFileSaveDir+'\'+Filename)); //删除已上传的文件
  463. DeleteDirectory(pub_UnZipFileSaveDir); //删除已经上传的文件夹的所有txt
  464. except
  465. on e:exception do
  466. begin
  467. FMessage:='文件上传FTP服务器出错!'#+e.Message;
  468. LogInfo(FMessage,true,true);
  469. Exit;
  470. end;
  471. end;
  472. end;
  473. end;
  474. ZipUpLoadDirTemp:=ZipUpLoadDir;
  475. Result:=True;
  476. end;
  477.  
  478. function TFtpContentThd.Update_Content_Bak_Date: Boolean;
  479. var
  480. sql1,sql2 : string;
  481. begin
  482. Result := True;
  483. try
  484. // 如果上面对数据进行处理出现异常时,则退出本次上传
  485. // 全部数据上传成功,则进行状态重置
  486. Sql1 := 'BEGIN UPDATE TICKET_CONTENT_BAK_DATE SET STATUS=1,POST_DATE=SYSDATE, ' +
  487. ' POST_COUNT=' + Quotedstr(IntTostr(FCount)) +
  488. ' WHERE STATUS = 0;';
  489.  
  490. // 插入下一条上传时间段
  491. sql2 := ' INSERT INTO TICKET_CONTENT_BAK_DATE (ID,START_DATE,END_DATE,POST_COUNT,POST_DATE,STATUS) ' +
  492. ' VALUES(SEQ_CONTENT_BAK_DATE.Nextval,TO_DATE('+ Quotedstr(Formatdatetime('YYYY-MM-DD hh:mm:ss',FEnd_Date)) +
  493. ',' + QuotedStr('yyyy-mm-dd hh24:mi:ss') + '),TO_DATE(' + Quotedstr(Formatdatetime('YYYY-MM-DD hh:mm:ss',FNextDate)) +
  494. ',' + QuotedStr('yyyy-mm-dd hh24:mi:ss') + '),0,SYSDATE,0);' +
  495. ' COMMIT; END;' ;
  496. ClientDataModule.orqry1.SQL.Clear;
  497. ClientDataModule.orqry1.SQL.Text := sql1 + sql2;
  498. ClientDataModule.orqry1.Execute;
  499. ClientDataModule.orqry1.Close;
  500. //
  501. //LogInfo('建立下一次上传区间');
  502. except on ex:exception do
  503. begin
  504. FMessage := '更新上传状态时,服务器断开或异常。' + Ex.Message;
  505. LogInfo(FMessage,True);
  506. Result := False;
  507. end;
  508. end;
  509. end;
  510.  
  511. {循环删除整个目录下的所有文件包括文件夹}
  512. function TFtpContentThd.DeleteDirectory(NowPath: string): Boolean;
  513. var
  514. search: TSearchRec;
  515. ret: integer;
  516. key: string;
  517. begin
  518. Result:=False;
  519. if NowPath[Length(NowPath)] <> '\' then
  520. NowPath := NowPath + '\';
  521. key := NowPath + '*.*';
  522. ret := findFirst(key, faanyfile, search);
  523. while ret = do
  524. begin
  525. if ((search.Attr and fadirectory) = fadirectory) then
  526. begin
  527. if (search.Name <> '.') and (search.name <> '..') then
  528. begin
  529. DeleteDirectory(NowPath + search.name);
  530. removedir(NowPath + search.name); //如果需要删除文件夹则添加
  531. end;
  532. end
  533. else
  534. begin
  535. if ((search.Attr and fadirectory) <> fadirectory) then
  536. begin
  537. deletefile(PAnsiChar(NowPath + search.name));
  538.  
  539. end;
  540. end;
  541. ret := FindNext(search);
  542. end;
  543. SysUtils.FindClose(search);
  544. //FindClose(search.FindHandle);
  545. //FindClose(search); //发现在线程里面不能用这,只能用上面的句柄
  546. //removedir(NowPath); //如果需要删除最外层文件夹则添加
  547. result := True;
  548. end;
  549. procedure TFtpContentThd.LogInfo(AMsg: string; const blnIsErrorMsg,
  550. BoolSaveToFile: Boolean);
  551. begin
  552. pub_Critical.Enter;
  553. try
  554. FLogMsg(AMsg,blnIsErrorMsg,BoolSaveToFile);
  555. finally
  556. pub_Critical.Leave;
  557. end;
  558. end;
  559.  
  560. initialization
  561. //
  562. finalization
  563. //
  564. end.

代码

  1. procedure TFrmFTP_ZIP.btnBreUpLoadClick(Sender: TObject);
  2. var
  3. tStream: TFileStream;
  4. Size1:Integer;
  5. begin
  6. if IdFTP1.Connected then
  7. begin
  8. if not UploadOpenDialog1.Execute then
  9. Exit;
  10. tStream:=TFileStream.Create(UploadOpenDialog1.FileName,fmOpenRead );
  11. try
  12. Size1 :=IdFTP1.Size(ExtractFileName(UploadOpenDialog1.FileName));
  13. if Size1 > then //这样判断文件是否存在 是错误的。
  14. begin
  15. case MessageDlg('文件已经存在,是否续传?', mtConfirmation, mbYesNoCancel, ) of
  16. mrYes:
  17. begin
  18. tStream.Position:=Size1;
  19. //tStream.Seek(IdFTP1.Size('Delphi大量pdf资料非扫描档1.zip'),0) ; //也可以。
  20. IdFTP1.Put(tStream,ExtractFileName(UploadOpenDialog1.FileName),true); //续传
  21. end;
  22. mrNo:
  23. begin
  24. IdFTP1.Put(tStream,ExtractFileName(UploadOpenDialog1.FileName),False); //重新传
  25. end;
  26. mrCancel: Exit; //取消
  27. end;
  28. end
  29. else
  30. IdFTP1.Put(tStream,ExtractFileName(UploadOpenDialog1.FileName),False);
  31.  
  32. { tStream.Position:=IdFTP1.Size('Delphi大量pdf资料非扫描档1.zip'); //当前路径的指定文件
  33. //tStream.Seek(IdFTP1.Size('Delphi大量pdf资料非扫描档1.zip'),0) ; //也可以。
  34. IdFTP1.Put(tStream,'Delphi大量pdf资料非扫描档1.zip',true); }
  35.  
  36. finally
  37. tStream.Free;
  38. end;
  39. end
  40. else
  41. ShowMessage('Ftp未连接');
  42. end;
  43.  
  44. procedure TFrmFTP_ZIP.btnBreDownLoadClick(Sender: TObject);
  45. begin
  46. if IdFTP1.Connected then
  47. begin
  48. if FileExists('Delphi大量pdf资料非扫描档1.zip') then
  49. begin
  50. case MessageDlg('文件已经存在,是否续传?', mtConfirmation, mbYesNoCancel, ) of
  51. mrYes: FtpDownLoad( 'Delphi大量pdf资料非扫描档1.zip', True); //续传
  52. mrNo: FtpDownLoad( 'Delphi大量pdf资料非扫描档1.zip', False); //覆盖
  53. mrCancel: Exit; //取消
  54. end;
  55. end
  56. else
  57. FtpDownLoad( 'Delphi大量pdf资料非扫描档1.zip', False); //建立新文件下载
  58. end
  59. else
  60. ShowMessage('Ftp未连接');
  61. end;

断点上传和断点下载代码

5、利用控件TVCLZip和TIdFTP压缩文件并上传到FTP的线程单元pas 改进版的更多相关文章

  1. WPF中利用控件的DataContext属性为多个TextBox绑定数据

    工作上需要从给定的接口获取数据,然后显示在界面的编辑框中,以往肯定会一个一个的去赋值,但这样太麻烦而且效率很低,不利于维护,于是想到了数据绑定这一方法,数据绑定主要利用INotifyPropertyC ...

  2. 百度 flash html5自切换 多文件异步上传控件webuploader基本用法

    双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...

  3. WebBrowser控件应用:播放PPT文件

    原文:WebBrowser控件应用:播放PPT文件 一开始想的是用webform来做,用iframe加载文件,把ppt文件另存成htm,然后播放. 可是后来发现,的程序不大容易控制,所以改用winfo ...

  4. 使用NeatUpload控件实现ASP.NET大文件上传

    使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...

  5. Delphi/XE2 使用TIdHttp控件下载Https协议服务器文件[转]

    之前的一篇博文详细描述了使用TIdhttp控件下载http协议的文件,在我项目的使用过程中发现对于下载Https协议中的文件与Http协议的文件不同,毕竟Https在HTTP协议基础上增加了SSL协议 ...

  6. 如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式

    如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式 首先我们来说说为何要生成sourceMap文件呢?简单的说,sourceMap是为了压缩后的代码调式提 ...

  7. Web大文件(夹)上传(断点续传)控件-Xproer.HttpUploader6

    版权所有 2009-2017荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  8. jquery文件批量上传控件Uploadify3.2(java springMVC)

    人比較懒  有用为主 不怎么排版了 先放上Uploadify的官网链接:http://www.uploadify.com/  -->里面能够看到PHP的演示样例,属性说明,以及控件下载地址.分f ...

  9. 文件夹上传控件webupload插件

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

随机推荐

  1. python安装paramiko模块

    一.简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  2. IPv6地址介绍

    IPv6地址介绍 2008 年 04 月 10 日 1. 认识IPv6地址 IPv4地址是类似 A.B.C.D 的格式,它是32位,用\".\"分成四段,用10进制表示:而IPv6 ...

  3. Makefile_:=与=的区别

    1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo            y ...

  4. TCP/IP五层模型

    (2)TCP/IP五层模型的协议   应用层 传输层 网络层 数据链路层 物理层   物理层:中继器.集线器.还有我们通常说的双绞线也工作在物理层 数据链路层:网桥(现已很少使用).以太网交换机(二层 ...

  5. NYOJ题目766回文数

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAHaCAIAAACSPygsAAAgAElEQVR4nO3dO3LqSheG4X8S5AyEWB ...

  6. KMP算法学习

    kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...

  7. 《linux系统及其编程》实验课记录(六)

    实验 6:Linux 文件系统 实验环境: 安装了 Red Hat Enterprise Linux 6.0 可运行系统,并且是成功验证系统.有另外一个无特权用户 student,密码 student ...

  8. js判断访问的当前设备是手机还是电脑

    function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUser ...

  9. h264 profile & level

    转自:http://blog.csdn.net/sphone89/article/details/17492433 H.264 Profiles H.264有四种profile,每个profile支持 ...

  10. leetcode1237

    date: 2015-09-09 20:20:58 Two Sum Given an array of integers, find two numbers such that they add up ...