Lazarusでftp接続してみた
環境
Ubuntu 16.04 LT (VirtalBoxにて)
Lazarus 2.0.10
必要な情報
ftpサーバのアカウントとパスワード(x-sreverなどにて取得)
idFTP1.Host
idFTP1.Username
idFTP1.Password
実施した内容
1,ftpサーバへの接続
2,フォルダーリストの収集
3,ファイルのアップロード
4、ファイルのダウンロード
5、ファイルの削除
6、ファイル名の変更
7、ファイルの移動
手順
パッケージ「indy」を読み込む
パッケージ>OnlinePackageManager
IdFTP
を、設置
参考ページ
https://www.getlazarus.org/forums/viewtopic.php?t=51
http://mrxray.on.coocan.jp/Delphi/plSamples/773_Indy_FTPGetPut.htm
ポイント
1,ftpサーバへの接続
・パッケージindyのTIdFTPを利用
2,フォルダーリストの収集
・接続後 FTP.List、FTP.DirectoryListing.Items[i].FileName
で、ファイル名を取得
3,ファイルのアップロード
・ファイルパスを指定して FTP.Put(SourceFile, UpLoadFile)で実施
4、ファイルのダウンロード
・FTP.Getただし、ストリームで来るため、文字列変換などが必要
FTP.Get(srcFile, Stream)
5、ファイルの削除
・ FTP.Delete(deldFile)で行う、
ファイルがないときはexceptが発生してくれる
6、ファイル名の変更
・ FTP.Rename(LOldName,LName)で行う、
ファイルがないときはexceptが発生してくれる
7、ファイルの移動
・ファイル名変更と同じ手順、変更先をパス指定で移動ができる
プログラム
procedure TForm1.Button1Click(Sender: TObject); var FTP: TIdFTP; begin FTP := TIdFTP.Create( nil ); FTP.Host := 'xxxx.xserver.jp'; FTP.Username := 'xxxx@xxxx.xsrv.jp'; FTP.Password := 'xxxx'; try FTP.Connect; except FTP.Disconnect; MessageDlg('サーバの接続に失敗しました.', mtInformation, [mbOK], 0); exit; end; end; procedure TForm1.Button2Click(Sender: TObject); var FTP: TIdFTP; i: integer; LFileName:string; begin FTP := TIdFTP.Create( nil ); FTP.Host := 'xxxx.xserver.jp'; FTP.Username := 'xxxx@xxxx.xsrv.jp'; FTP.Password := 'xxxx'; try FTP.Connect; FTP.ChangeDir( '/' ); FTP.List; for i := 0 to FTP.DirectoryListing.Count - 1 do begin LFileName := FTP.DirectoryListing.Items[i].FileName; //ファイル名が'.'または'..'の時は除外 if (LFileName = '.') or (LFileName = '..') then Continue; Memo1.Append(LFileName) end; except Screen.Cursor := crDefault; FTP.Disconnect; MessageDlg('サーバの接続に失敗しました.', mtInformation, [mbOK], 0); exit; end; end; function StreamToString(Stream: TStream): string; var ms: TMemoryStream; begin Result := ''; ms := TMemoryStream.Create; try ms.LoadFromStream(Stream); SetString(Result, PChar(ms.memory), ms.Size); finally ms.Free; end; end; procedure TForm1.Button3Click(Sender: TObject); var FTP: TIdFTP; i: integer; ss,LFileName,SourceFile,UpLoadFile:string; Stream : TMemoryStream; begin FTP := TIdFTP.Create( nil ); FTP.Host := 'xxxx.xserver.jp'; FTP.Username := 'xxxx@xxxx.xsrv.jp'; FTP.Password := 'xxxx'; SourceFile := '/home/kon009/lazarus/blog/ftp/test01.txt'; // アップロードするファイル名(クライアント:ローカル) UpLoadFile := '/test01.txt'; // アップロードするファイル名(サーバー上) try FTP.Connect; FTP.ChangeDir( '/' ); except FTP.Disconnect; ShowMessage('FTP接続に失敗しました。'); Exit; end; try FTP.Put(SourceFile, UpLoadFile); ShowMessage('アップロードしました') except ShowMessage('アップロードに失敗しました') end; FTP.Disconnect; end; procedure TForm1.Button4Click(Sender: TObject); var FTP: TIdFTP; i: integer; ss,LFileName,srcFile,dstFile:string; Stream : TMemoryStream; begin FTP := TIdFTP.Create( nil ); FTP.Host := 'xxxx.xserver.jp'; FTP.Username := 'xxxx@xxxx.xsrv.jp'; FTP.Password := 'xxxx'; srcFile := '/abc.json'; // 読み込むファイル名(サーバー上) dstFile := '/home/kon009/lazarus/blog/ftp/abc.json'; // 書き込むファイル名(クライアント:ローカル) try FTP.Connect; FTP.ChangeDir( '/' ); except FTP.Disconnect; ShowMessage('FTP接続に失敗しました。'); Exit; end; Stream := TMemoryStream.Create; try FTP.Get(srcFile, Stream); if (Stream.Size<>0) then begin Stream.SavetoFile(dstFile); ss:=StreamToString(Stream); memo1.Text:=ss; end else ShowMessage('ファイルが見つかりませんでした。'); except ShowMessage('FTP接続に失敗しました。') end; Stream.free; FTP.Disconnect; end; procedure TForm1.Button5Click(Sender: TObject); var FTP: TIdFTP; ss,LFileName,srcFile,deldFile:string; Stream : TMemoryStream; begin FTP := TIdFTP.Create( nil ); FTP.Host := 'xxxx.xserver.jp'; FTP.Username := 'xxxx@xxxx.xsrv.jp'; FTP.Password := 'xxxx'; deldFile := '/test01.txt'; // 削除するファイル名(サーバー上) try FTP.Connect; FTP.ChangeDir( '/' ); except FTP.Disconnect; ShowMessage('FTP接続に失敗しました。'); Exit; end; try FTP.Delete(deldFile); ShowMessage('ファイルを削除しました'); except ShowMessage('削除に失敗しました。') end; FTP.Disconnect; end; procedure TForm1.Button6Click(Sender: TObject); var FTP: TIdFTP; ss,LFileName,LOldName,LName:string; Stream : TMemoryStream; begin FTP := TIdFTP.Create( nil ); FTP.Host := 'xxxx.xserver.jp'; FTP.Username := 'xxxx@xxxx.xsrv.jp'; FTP.Password := 'xxxx'; LOldName := '/test01.txt'; // 変更前ファイル名(サーバー上) LName := '/test02.txt'; // 変更後ファイル名(サーバー上) try FTP.Connect; FTP.ChangeDir( '/' ); except FTP.Disconnect; ShowMessage('FTP接続に失敗しました。'); Exit; end; try FTP.Rename(LOldName, LName); ShowMessage('ファイルを変更しました'); except ShowMessage('変更に失敗しました。') end; FTP.Disconnect; end; procedure TForm1.Button7Click(Sender: TObject); var FTP: TIdFTP; ss,LFileName,LOldName,LName:string; Stream : TMemoryStream; begin FTP := TIdFTP.Create( nil ); FTP.Host := 'xxxx.xserver.jp'; FTP.Username := 'xxxx@xxxx.xsrv.jp'; FTP.Password := 'xxxx'; LOldName := '/test01.txt'; // 移動前ファイル名(サーバー上) LName := '/dja/test01.txt'; // 移動後ファイル名(サーバー上) try FTP.Connect; FTP.ChangeDir( '/' ); except FTP.Disconnect; ShowMessage('FTP接続に失敗しました。'); Exit; end; try FTP.Rename(LOldName, LName); ShowMessage('ファイルを移動しました'); except ShowMessage('移動に失敗しました。') end; FTP.Disconnect; end;