Lazarusでftp接続してみた

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;