::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2004-10-09 19:29:55, Hit : 7676, Vote : 1362
 http://www.howto.pe.kr
 FTP로 디렉토리 목록(ls -l) 구하기

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinInet;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  // 델파이 버전에 따라 FtpCommand 의 마지막 파라미터가 틀리므로 확인하고 사용
  function FtpCommand(
    hConnect: HINTERNET;
    fExpectResponse: BOOL;
    dwFlags: DWORD;
    lpszCommand: PChar;
    dwContext: DWORD;
    phFtpCommand: PHINTERNET): BOOL;
    stdcall; external 'wininet.dll' name 'FtpCommandA';

var
  Form1: TForm1;

implementation

{$R *.dfm}

function FtpGetDirectoryList(strHost: String;
                             port: Word;
                             StrUser: String;
                             strPwd: String;
                             cmd: String): String;
var
  hNet, hFTP: HINTERNET;
  data_handle: HINTERNET;
  bytes_read: DWORD;
  text_buffer: PChar;
  buffer_size: DWORD;
begin
  Result := '';

  // WinInet 를 초기화 한다
  hNet := InternetOpen(PChar(Application.Title), // HTTP의 agent로 등록된다
                       INTERNET_OPEN_TYPE_PRECONFIG, // AccessType
                       nil,
                       nil,
                       0);
  if hNet = nil then
  begin
    ShowMessage('WinInet.Dll 을 초기화할 수 없습니다');
    Exit;
  end;

  // FTP 서버에 접속한다
  hFTP := InternetConnect(hNet, // WinInet 세션 핸들
                          PChar(strHost), // FTP 서버
                          port, // 포트
                          PChar(StrUser), // 유저ID
                          PChar(strPwd),  // 비밀번호
                          INTERNET_SERVICE_FTP, // 서버 타입(FTP,HTTP,,,)
                          0, // flag: 0 or INTERNET_FLAG_PASSIVE
                          0);
  if hFTP = nil then
  begin
    InternetCloseHandle(hNet);
    ShowMessage('FTP 서버에 접속할 수 없습니다');
    Exit;
  end;

  // 주의:
  //   FTP 프로토콜은 21번 제어 포트 이외에 20번 데이터 포트를 내부적으로 사용한다
  //   즉, 20번 포트는 21번 포트로 요청한 FTP 명령어에 비교적 긴 응답을 받을떄 사용된다
  //   그러므로 FTP raw 명령어중 21번 포트로 요청한 FTP 명령어에 응답을 그대로 21번으로
  //   주는지 20번 데이터 포트로 주는지 알고 써야 한다
  //   대표적으로 LIST, NLST, RETR, STOR, REST, STAT 등이 20번 포트를 사용한다
  //   그리고 SIZE, MODE, DELE, MRD 같은 비교적 응답이 짧은것은 21번으로 그대로 준다
  // 그러므로 아래 data_handle는 20번 포트를 사용한다는 의미이다
  // FTP raw command list: http://www.nsftools.com/tips/RawFTP.htm
  
  data_handle := NIL;
  if not FtpCommand(hFTP,
                    True, // 응답을 받을것인가
                    FTP_TRANSFER_TYPE_ASCII, // 이진 응답은 FTP_TRANSFER_TYPE_BINARY
                    PChar(cmd),
                    DWORD(0),
                    @data_handle) // 응답을 받는다면 이곳으로...
  then
    exit;

  buffer_size := 1000;
  GetMem(text_buffer, buffer_size);
  try
    bytes_read := 1;
    while bytes_read > 0 do
    begin
      InternetReadFile(data_handle, text_buffer, buffer_size, bytes_read);
      result := result + System.Copy(text_buffer, 0, bytes_read);
    end;
  finally
    FreeMem(text_buffer,buffer_size);
    InternetCloseHandle(data_handle);
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
  end;    
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // NLST
  //   Syntax: NLST [remote-directory]
  //   간단한 형태의 디렉토리 리스트 정보
  Memo1.Clear;
  Memo1.Text := FtpGetDirectoryList('127.0.0.1',
                                    INTERNET_DEFAULT_FTP_PORT,
                                    'johndoe',
                                    'test1234',
                                    'NLST'); // 홈디렉토리의 ls
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // LIST
  //   Syntax: LIST [remote-filespec]
  //   ls -l 과 같은 형태의 디렉토리 리스트 정보
  Memo1.Clear;
  Memo1.Text := FtpGetDirectoryList('127.0.0.1',
                                    INTERNET_DEFAULT_FTP_PORT,
                                    'johndoe',
                                    'test1234',
                                    'LIST'); // 홈디렉토리/public_html 의 ls -l
end;

end.





971   [시스템] 사용중인 USB 포트의 장치정보 구하기  김영대 2008/11/04 18337 1506
970   [윈도우즈 API] ShellExecute(Ex) 사용법 예제 12가지  김영대 2004/09/22 16963 1681
969   [시스템] 원도우즈 도메인 이름 구하기  김영대 2008/11/04 12381 1391
968   [네트웍/인터넷] IOCP(I/O Completion Port) class  김영대 2003/11/18 10416 798
967   [윈도우즈 API] 디렉토리나 파일의 속성(변경/생성/사용한 날짜, 특성) 바꾸기  김영대 2004/12/08 9759 1367
966   [데이터베이스] DBGrid의 Column, Record 의 위치 저장/이동  김영대 2003/03/04 8994 1381
965   [시스템] 델파이로 DOS 프로그램(Console application) 만들기  김영대 2003/03/06 8702 2828
964   [윈도우즈 API] 다른 프로그램에 마우스/키보드 이벤트 발생시키기  김영대 2004/09/07 7947 1294
963   [윈도우즈 API] URLDownloadToFile()를 사용한 파일 다운받기  김영대 2004/12/15 7887 1432
962   [시스템] 한글 한 음절을 초성,중성,종성 음소로 분해하기('김' => 'ㄱ'+'ㅣ'+'ㅁ')  김영대 2004/10/22 7789 1258
961   [윈도우즈 API] 실행 파일의 아이콘 바꾸기  김영대 2008/11/27 7729 1432
960   [COM/OLE] 탐색기에서 파일을 선택하여 ActiveX(ActiveFortm)에 Drag&Drop 하기  김영대 2005/01/06 7705 1304
  [네트웍/인터넷] FTP로 디렉토리 목록(ls -l) 구하기  김영대 2004/10/09 7676 1362
958   [윈도우즈 API] 외부 프로그램 실행하기(ShellExecute) 정리  김영대 2003/03/05 7626 1413
957   [일반/컴포넌트] RichEdit 2.0 줄간격 조정  김영대 2005/02/11 7600 1312
956   [네트웍/인터넷] 윈도우즈 소켓의 에러번호에 대한 설명  김영대 2003/03/05 7600 2641
955   [네트웍/인터넷] HTTP의 다운받을 파일의 정보만 미리 읽어오기  김영대 2004/12/02 7563 1415
954   [네트웍/인터넷] RFC: Request for Comments  김영대 2003/03/05 7537 1977
953   [시스템] 2기가 이상의 하드의 남은 용량 알아내기...  김영대 2003/03/06 7395 2071
952   [시스템] '응답없음' 프로세서를 감지하는 잼나는 방법  구창민 2003/03/14 7325 1205
951   [시스템] 시스템의 각종 정보  김영대 2003/03/06 7244 1250
950   [시스템] 시스템 타임이 변경되었는지를 알아내려면...  김영대 2003/03/05 7243 2002
949   [시스템] 마우스의 좌/우 기능설정과 버튼갯수 알기  김영대 2003/03/06 7208 1958
948   [시스템] 시스템 대기모드/화면 보호기/모니터 끄기 이벤트 감지하기  김영대 2005/07/21 7194 1539
947   [일반/컴포넌트] 눌려진 키보드 키의 명칭 구하기  김영대 2003/03/07 7131 1373
946   [시스템] 인증서(certificate) 파일에서 직접 정보 읽어오기  김영대 2004/10/29 7100 1445
945   [네트웍/인터넷] Ethernet 랜카드의 MAC adress 구하기  김영대 2003/03/07 7080 1843
944   [윈도우즈 API] 작업표시줄의 시계 감추기/보이기  김영대 2003/03/27 7040 1921
943   [시스템] 윈도우즈 등록정보의 보안에 있는 권한 설정 변경하기(NT/2000/XP)  김영대 2004/09/25 7038 1539
942   [네트웍/인터넷] How to bring a network down - "Win Nuke"  김영대 2003/03/06 7028 1919
941   [네트웍/인터넷] List of raw FTP commands  김영대 2003/03/05 7021 1828
940   [네트웍/인터넷] NetMask 알아내기  김영대 2003/03/07 7003 1797
939   [일반/컴포넌트] 명령행 인자 받아오기  김영대 2003/03/05 6987 1821
938   [일반/컴포넌트] List of the Delphi 3 file types  김영대 2003/03/05 6935 1296
937   [일반/컴포넌트] 문자가 영문/숫자/영숫자/한글 인지 검사하기  김영대 2004/08/31 6801 1473
936   [네트웍/인터넷] 네트워크 공유 설정/공유 사용 권한/해제 하기 (Windows XP)  김영대 2004/11/09 6791 1352
935   [네트웍/인터넷] NT 네트워크 환경의 컴퓨터 리스트 구하기  김영대 2003/03/07 6787 1694
934   [시스템] DOS 명령어 실행하고 실시간 결과 받아오기  김영대 2004/09/29 6734 1385
933   [일반/컴포넌트] Thread in a Timer  김영대 2003/04/07 6726 1066
932   [네트웍/인터넷] Ping 소스  김영대 2004/08/09 6723 1209

1 [2][3][4][5][6][7][8][9][10]..[25] [다음 10개]
 

Copyright 1999-2019 Zeroboard / skin by zero