프로그래밍 노트

[델파이] TIdFTP로 FTP 클라이언트 만들기 본문

델파이

[델파이] TIdFTP로 FTP 클라이언트 만들기

띠리 2008. 6. 30. 17:37

TIdFTP로 FTP 클라이언트를 만드는데 여러번 삽질을 했다.
자료가 많이 있거나 샘플이 어디 있는지 알면 좋았겠지만
내 검색 능력으로는 잘 검색되지 않아서 나름 고생했다.


FTP 서버 접속

  // ftpCt: TIdFTP; 폼에서 선언
  ftpCt.Host := edtHost.Text;  
  // 기본 FTP 포트를 사용하는 경우, 설정 안해도 됨
  ftpCt.Port := StrToInt(edtPort.Text);
  // Anonymous(익명)로 접속하는 경우 아래와 같이 설정
  ftpCt.Username := 'anonymous';//edtId.Text;
  // 익명 접속일 경우 패스워드 설정할 필요 없음
  //ftpCt.Password := edtPass.Text;
  // FTP 서버에 접속
  ftpCt.Connect;

FTP 서버에서 파일 리스트 가져오기

파일 리스트를 가져오는 방법은 두가지가 있다.
파일명이나 폴더명을 가져오는 방법과
파일명의 속성같은 정보를 한번에 가져오는 방법이 있다.

물론 파일 리스트를 가져오기전에 FTP를 접속해야된다.

  * 파일명만 가져오는 방법

  slFile := TStringList.Create;
  try
    // FTP 폴더를 바꾸는 방법
    ftpCt.ChangeDir('/');

    // 파일명만 가져오기
    //   선택된 폴더의 파일 리스트를 TStringList파일에 저장한다.
    ftpCt.List(slFile, '', false);

    // 저장된 리스트를 리스트 박스에 추가
    for i := 0 to slFile.Count - 1 do
      lstFolder.Items.Add(slFile.Strings[i]);

  finally
    slFile.Free;
    ftpCt.Quit;
  end;
  ftpCt.Disconnect;


  * 파일속성까지 가져오는 방법

  try
    ftpCt.ChangeDir('/');
    // 선택된 폴더의 파일 리스트(속성 포함)를
    //  DirectoryListing에 자료를 저장
    ftpCt.List(nil);

    // 리스트에 저장한 값 리스트박스에 추가
    for i := 0 to ftpCt.DirectoryListing.Count -1 do
    begin
      // 디렉토리(ditDirectory )인지 파일(ditFile)인지 구분
      if ftpCt.DirectoryListing.Items[i].ItemType = ditDirectory then
        sFile := ftpCt.DirectoryListing.Items[i].FileName ;  // 파일이름
      // 리스트박스에 추가
      lstAtt.Items.Add(sFile);
    end;
  finally
    ftpCt.Quit;
  end;
  ftpCt.Disconnect;


★여기서 중요한 것이 있다.
FTP서버가 윈도우즈 계열인 경우, 파일 속성까지 가져오려해도(ftpCt.List(nil))
리스트를 제대로 가져오지 못한다.
FTP서버가 윈도우즈 계열인 경우에는 uses에서 IdFTPListParseWindowsNT
추가해주어야지만 제대로 리스트를 가져올 수 있다.
이것을 몰라서 하루종일 해맸다.

FTP 서버에서 지정한 파일 가져오기

FTP에서 파일을 클라이언트로 카피하기

  // FTP가 연결되어있는가
  if ftpCt.Connected then
  begin
    try
      // 파일이 있는 폴더 설정
      sFolder := '/'+ lstFolder.Items.Strings[lstFolder.ItemIndex];
      // FTP 서버에 있는 파일명
      sSrcFile := lstFile.Items.Strings[lstFile.ItemIndex];
      // 클라이언트 컴퓨터에 카피할 파일명
      sTrgFile := 'c:\' + lstFile.Items.Strings[lstFile.ItemIndex];

      ftpCt.TransferType := ftASCII;
      // 폴더 바꾸기
      ftpCt.ChangeDir(sFolder);
      // FTP 서버에서 파일 가져오기
      ftpCt.Get(sSrcFile, sTrgFile, true);
    finally
      ftpCt.Quit;
    end;

참고사항

위 소스를 돌리기 위해서는 밑의 클래스들을
uses에 추가해야된다.

uses
 IdFTP, IdFTPCommon, IdFTPListParseWindowsNT, IdFTPList;


---------- ---------- ---------- ---------- ----------

파일을 업로드할 때는 Put 함수를 사용함
Put(컴퓨터 안의 파일 풀패스, FTP 서버의 풀 패스)

Comments