|
제가 간단한 FTP program을 만들어보고있는데요
책에 있는 그대로 했는데도 자꾸 error가 발생됩니다.
첨부된 Source대로 해서 사용했을때 접속까지는 문제가 없는데
접속한 이후에 directory를 옮기고싶어서 click을 하면 하위디렉토리 잘 옮겨지구요
다시 하위디렉토리나 아니면 상위디렉토리로 가려고할때 error가 발생합니다.
error는 "Project XXXX.exe raised exception class Exception with message 'A list command is already being processed!'." 라는 message입니다.
간단하게 실행중인 list command가 다시 호출됬다는 것인데요. 그렇다면 어떻게 연결을 끊지않고
reload할수있는지 조언해주시면 감사하겠습니다.
궁극적으로는 저는 remote에 접속해서 해당 directory를 하위 directory포함해서 모두 끌어오는것을
하려는것인데 더 좋은 방법이 있으면 알려주시면 감사하겠습니다.
전체 sample source는 첨부되어있습니다.
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
Form1->NMFTP1->UserID = Edit1->Text;
Form1->NMFTP1->Password = Edit2->Text;
Form1->NMFTP1->Host = Edit3->Text;
Form1->NMFTP1->TimeOut = 3000;
try {
if( NMFTP1->Connected )
{
NMFTP1->Disconnect();
}
else
{
NMFTP1->Connect();
if( NMFTP1->Connected )
{
SpeedButton1->Caption = "Disconnect";
Memo1->Lines->Add( "Remote Directory " + NMFTP1->CurrentDir );
ListBox1->Items->Add( "[..]" );
Form1->NMFTP1->List(); <----- 최초 call한 부분
}
}
}
catch (...)
{
NMFTP1->Disconnect();
ListBox1->Clear();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMFTP1Success(TCmdType Trans_Type)
{
switch( Trans_Type )
{
case cmdList:
break;
case cmdChangeDir:
Memo1->Lines->Add("ChangeDir successful");
NMFTP1->List(); ---> change directory 를 할때마다 재실행되는 부분
break;
case cmdMakeDir:
Memo1->Lines->Add("MakeDir successful");
break;
case cmdRemoveDir:
Memo1->Lines->Add("RemoveDir successful");
break;
case cmdDelete:
Memo1->Lines->Add("Delete successful");
break;
case cmdRename:
Memo1->Lines->Add("Rename successful");
break;
case cmdReInit:
Memo1->Lines->Add("Reinitialize successful");
break;
case cmdCurrentDir:
// Memo1->Lines->Add("CurrentDir successful");
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMFTP1ListItem(AnsiString Listing)
{
char *List;
List = Listing.c_str();
if(( List[0] == '-' ) || ( List[0] == 'd' ) || ( List[0] == 'r' ))
ListBox1->Items->Add( List );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1DblClick(TObject *Sender)
{
AnsiString RemoteFile, RemoteDir, sTemp;
int Temp;
RemoteFile = ListBox1->Items->Strings[ ListBox1->ItemIndex ];
if( RemoteFile.c_str()[0] == 'd' )
{
RemoteDir = NMFTP1->CurrentDir + "/"
+ RemoteFile.SubString( RemoteFile.LastDelimiter( " " ) + 1,
RemoteFile.Length() );
Dis_File( RemoteDir );
return;
}
if( RemoteFile == "[..]" )
{
if( NMFTP1->CurrentDir.LastDelimiter( "/" ) == 1 ) return;
RemoteDir = NMFTP1->CurrentDir.SubString( 1,
NMFTP1->CurrentDir.LastDelimiter( "/" ) - 1 );
Dis_File( RemoteDir );
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Dis_File( AnsiString rDir )
{
ListBox1->Clear();
ListBox1->Items->Add( "[..]" );
NMFTP1->ChangeDir( rDir ); ---> directory change를 하는 부분
}
|