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;