Q&A

  • idFTP사용시 디렉토리에 파일이 없으면 파일없다는 에러 해결은 어떻게 하나요
idFTP사용시
idFTP.List(....)를 사용해서 리스트를 받아올때 디렉토리에 파일이 없으면 파일이 없다는 에러를 표시하잖아요.  그럴때 파일없다는 에러표시 안뜨게 하는 방법좀 알려 주세요.  
idFTP.List하기전에 해당디렉토리의 파일갯수를 알수는 없을까요?
4  COMMENTS
  • Profile
    Crazy™ 2005.01.14 01:48
    try
    except
    end
    예외처리 해주면 되죠.
    그리고 list 받아올때 directorylist 로 받지 않나요?
    directorylist.items.count 하면 갯수가 알수 있겠죠.

  • Profile
    임우식 2005.01.14 02:10
    답변 고맙습니다...그런데...

        AFile := TStringList.Create;
        try
          ftp.List(AFile,'',false);
        except
          showmessage('파일이 없습니다.');
        end;

    이렇게 했을경우에 파일이 없다는 내부에러메시지가 먼저 뜨고 다음 파일이없습니다 라는 메시지가 뜨는데 이럴땐 어떻하나요?
    그리고 directorylist.items.count 이것 혹시 directorylisting.count 아닌가요?
    directorylisting.count는 0으로만 잡히는데...
    아래 소스 올리니 수정부탁합니다

    procedure TfrmMain.displayFTP;
    var
      i,c:integer;
      s:string;
      AFile : TStringList;
    begin
        files.Items.clear;
        folder.Items.Clear;

        label1.Caption:=ftp.RetrieveCurrentDir;

        AFile := TStringList.Create;
        try
          ftp.List(AFile,'',false);
        except
          showmessage('파일이 없습니다.');
        end;

        showmessage(IntToStr(ftp.DirectoryListing.Count));

        for c:=0 to AFile.Count -1 do
        begin
          s:=AFile[c];
          i:=ftp.Size(s);
          if i= -1 then folder.Items.Add(nil, s)
          else files.Items.Add(s);
        end;
    end;
  • Profile
    Crazy™ 2005.01.14 20:58
    제가 사용하는 부분인데 불필요한 부분을 빼버리고 올렸습니다.
    참고하세요.

      private
        TransferrignData : Boolean;
        BytesToTransfer: LongWord;
        SizeToTransfer : LongWord;
        function GetNameFromDirLine(Line: String; Var IsDirectory: Boolean): String;

    function TF_Login.GetNameFromDirLine(Line: String; Var IsDirectory: Boolean): String;
    var
         i: Integer;
         DosListing: Boolean;
    begin
         IsDirectory := Line[1] = 'd';
         DosListing := False;
         for i := 0 to 7 do
         begin
              if (i = 2) and not IsDirectory then
              begin
                   IsDirectory := Copy(Line, 1, Pos(' ', Line) - 1) = '<DIR>';
                   if not IsDirectory then
                   begin
                     DosListing := Line[1] in ['0'..'9'];
                   end else begin
                        DosListing := True;
                   end;
             end;
             Delete(Line, 1, Pos(' ', Line));
             while Line[1] = ' ' do
             begin
                  Delete(Line, 1, 1);
             end;
             if DosListing and (i = 2) then Break;
         end;
    end;

    procedure TF_Login.Connect_Server;
    var
         sPath : String;
    begin
         DirectoryListBox.Items.Clear;
         IdFTP1.Disconnect;
         with IdFTP1 do
         begin
              try
                   Panel_Msg.Caption := 'FTP Server 접속중...';
                   Host     :=  '호스트명';
                   Username := '아이디';
                   Password := '암호';
                   IdFTP1.Connect( True );
                   TransferType := ftASCII;
                   List( DirectoryListBox.Items, '*.*', True );
              except
                   Panel_Msg.Caption := 'FTP 서버에 접속 실패!';
                   Exit;
              end;
         end;
    end;

    procedure TF_Login.File_Update( sUpdateFolder, sUpdateFile : String; b_ZipFile );
    var
         s_FileDate, s_FileSize, s_FileName : String;
         FTP_Name, FTP_Line : String;
         IsDirectory, b_Transfer : Boolean;
         i : Integer;
    begin
         s_FileName  := sUpdateFile;

         if not DirectoryExists( sUpdateFolder ) then
         begin
              ForceDirectories(  sUpdateFolder );
         end;

         if not IdFTP1.Connected then Exit;
         BytesToTransfer := 0;
         for i := 0 to DirectoryListBox.Items.Count - 1 do
         begin
              if Pos( UpperCase( s_FileName ), UpperCase(DirectoryListBox.Items[i])) <> 0 then
              begin
                   FTP_Line := DirectoryListBox.Items[i];
                   FTP_Name := GetNameFromDirLine(FTP_Line, IsDirectory);
                   BytesToTransfer := IdFTP1.Size(FTP_Name);
                   Break;
              end;
         end;

         if BytesToTransfer > 0 then
         begin
              SizeToTransfer := BytesToTransfer;
         end else begin
              ShowMessage( '서버에 ' + s_FileName + ' File이 존재하지 않습니다!' );
              Exit;
         end;

              //파일 비교후 다운로드...
              if b_Transper then
              begin
                   Label_FILENAME.Caption := s_FileName;
                   Label_DATE.Caption := s_FileDate + ' / ' + DateToTransfer;
                   ProgressBar1.Max := SizeToTransfer;
                   Panel_STATUS.Visible := True;
                   IdFTP1.TransferType := ftBinary;
                   IdFTP1.Get(FTP_Name, sUpdateFolder + s_FileName, True);
              end;
    end;

    procedure TF_Login.FormShow(Sender: TObject);
    begin
      Connect_Server;
      File_Update( '다운받을폴더', '파일명' );
    end;



  • Profile
    임우식 2005.01.17 22:31
    ^^