⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch25.htm

📁 好书《C++ Builder高级编程技术》
💻 HTM
📖 第 1 页 / 共 5 页
字号:

protected:

  fastcall virtual ~TMyFtp(void);

public:

  fastcall TMyFtp(Classes::TComponent* AOwner);

  
void __fastcall Connect(void);

  Classes::TStringList* __fastcall FindFiles(void);

  bool __fastcall BackOneDir(void);

  bool __fastcall ChangeDir(System::AnsiString *S);

  bool __fastcall ChangeDirCustom(System::AnsiString *S);

  bool __fastcall 
CreateDirectory(AnsiString S);

  bool __fastcall RemoveDir(System::AnsiString S);

  bool __fastcall RemoveDirCustom(System::AnsiString S);

  bool __fastcall DeleteFile(System::AnsiString S);

  bool __fastcall DeleteFileCustom(System::AnsiString 
S);

  bool __fastcall GetFile(System::AnsiString FTPFile,  System::AnsiString NewFile);

  bool __fastcall SendFile1(System::AnsiString FTPFile,  System::AnsiStringNewFile);

  bool __fastcall SendFile2(System::AnsiString FTPFile,  
System::AnsiStringNewFile);

  System::AnsiString *__fastcall CustomToFileName(System::AnsiString *S);

__published:

  __property Classes::TStringList* CurFiles = {read=FCurFiles, nodefault};

  __property System::AnsiString CurDir = 
{read=GetCurrentDirectory, nodefault};

  __property System::AnsiString UserID = {read=FUserID, write=FUserID, nodefault};

  __property System::AnsiString Password = {read=FPassword, write=FPassword,nodefault};

  __property System::AnsiString Server 
= {read=FServer, write=FServer, nodefault};

  __property Classes::TNotifyEvent OnNewDir = {read=FOnNewDir, write=FOnNewDir};

};



#endif



</FONT></PRE>
<P><A NAME="Heading24"></A><FONT COLOR="#000077"><B>Listing 25.2. The source for
the FTP 
component.</B></FONT></P>
<PRE><FONT COLOR="#0066FF">///////////////////////////////////////

// FTP.cpp

// FTP Component

// Copyright (c) 1997 by Charlie Calvert

//

///////////////////////////////////////

// Add a &quot;#pragma comment(lib, 
&quot;Inet.lib&quot;)&quot; statement to the

// module that requires the lib.

// Add a &quot;#pragma link &quot;codebox.obj&quot;&quot; into the module that needs

// an obj.

///////////////////////////////////////

#include &lt;vcl\vcl.h&gt;


#include &lt;wininet.h&gt;

#pragma hdrstop

#pragma comment(lib, &quot;Inet.lib&quot;)

#pragma link &quot;codebox.obj&quot;

#include &quot;codebox.h&quot;

#include &quot;Ftp2.h&quot;



__fastcall TMyFtp::~TMyFtp(void)

{

  if (FINet != NULL)

    
InternetCloseHandle(FINet);

  if (FFtpHandle != NULL)

    InternetCloseHandle(FFtpHandle);

}



__fastcall TMyFtp::TMyFtp(Classes::TComponent* AOwner)

: TComponent(AOwner)

{

  FCurFiles = new TStringList();

  FINet = 
InternetOpen(&quot;WinINet1&quot;, 0, NULL, 0, 0);

  FFtpHandle = NULL;

  FConnected = False;

}



void __fastcall TMyFtp::Connect(void)

{

  AnsiString S;

  AnsiString CR1(&quot;\x00D\x00A&quot;);



  FContext = 255;

  FFtpHandle = 
InternetConnect(FINet, FServer.c_str(), 0,

   FUserID.c_str(), FPassword.c_str(),

   INTERNET_SERVICE_FTP, 0, FContext);

  if (FFtpHandle == NULL)

  {

    S = &quot;Connection failed&quot; + CR1 +

         &quot;Server: &quot; + FServer + CR1 +

         
&quot;UserID: &quot; + FUserID + CR1 +

         &quot;Password: &quot; + FPassword;

    throw Exception(S);

  }

  else

  {

    FConnected = True;

    SetUpNewDir();

  }

}



System::AnsiString __fastcall TMyFtp::GetCurrentDirectory(void)

{

  
DWORD Len = 0;



  FtpGetCurrentDirectory(FFtpHandle, FCurDir.c_str(), &amp;Len);

  FCurDir.SetLength(Len);

  FtpGetCurrentDirectory(FFtpHandle, FCurDir.c_str(), &amp;Len);

  return FCurDir;

}



void __fastcall TMyFtp::SetUpNewDir(void)

{

  
FCurDir = GetCurrentDirectory();

  if (FOnNewDir != NULL)

    FOnNewDir(this);

}



AnsiString GetDots(int NumDots)

{

  AnsiString S;

  int i;

  for (i = 1; i &lt;= NumDots; i++)

    S = S + &quot; &quot;;

  return S;

}



AnsiString 
*GetFindDataStr(WIN32_FIND_DATA FindData, AnsiString *S)

{

  AnsiString Temp;

  switch (FindData.dwFileAttributes)

  {

    case FILE_ATTRIBUTE_ARCHIVE:

    {

      *S = `A';

      break;

    }



    case FILE_ATTRIBUTE_COMPRESSED:

      *S 
= `C';

      break;



    case FILE_ATTRIBUTE_DIRECTORY:

      *S = `D';

      break;



    case FILE_ATTRIBUTE_HIDDEN:

      *S = `H';

      break;



    case FILE_ATTRIBUTE_NORMAL:

      *S = `N';

      break;



    case 
FILE_ATTRIBUTE_READONLY:

      *S = `R';

      break;



    case FILE_ATTRIBUTE_SYSTEM:

      *S = `S';

      break;



    case FILE_ATTRIBUTE_TEMPORARY:

      *S = `T';

      break;



    default:

      *S = 
IntToStr(FindData.dwFileAttributes);

  }



  *S = *S + GetDots(75);

  S-&gt;Insert(FindData.cFileName, 6);

  Temp = IntToStr(FindData.nFileSizeLow);

  S-&gt;Insert(Temp, 25);

  return S;

}



Classes::TStringList* __fastcall 
TMyFtp::FindFiles(void)

{

  WIN32_FIND_DATA FindData;

  HINTERNET FindHandle;

  AnsiString Temp;



   FCurFiles-&gt;Clear();

   FindHandle = FtpFindFirstFile(FFtpHandle, &quot;*.*&quot;, &amp;FindData, 0, 0);

   if (FindHandle == NULL)

   {

     
return FCurFiles;

   }



   GetFindDataStr(FindData, &amp;Temp);

   FCurFiles-&gt;Add(Temp);



   while (InternetFindNextFile(FindHandle, &amp;FindData))

   {

     GetFindDataStr(FindData, &amp;Temp);

     FCurFiles-&gt;Add(Temp);

   }

   
InternetCloseHandle(FindHandle);



   return FCurFiles;

}



bool __fastcall TMyFtp::ChangeDir(System::AnsiString *S)

{

  if(!FConnected)

    throw Exception(&quot;You must connect first!&quot;);

  if (S-&gt;Length() != 0)

    if 
(!FtpSetCurrentDirectory(FFtpHandle, S-&gt;c_str()))

    {

      ShowMessage(&quot;Could not change to: &quot; + *S);

      return FALSE;

    }

  FindFiles();

  SetUpNewDir();

  return TRUE;

}



System::AnsiString *__fastcall 
TMyFtp::CustomToFileName(System::AnsiString *S)

{

  const int PreSize = 5;

  AnsiString Temp;

  int TempSize;



  TempSize = S-&gt;Length() - PreSize;

  Temp.SetLength(TempSize);

  *S = StripFromFront(*S, PreSize);

  memcpy(Temp.c_str(), 
S-&gt;c_str(), TempSize);

  *S = GetFirstToken(Temp, ` `);

  return S;

}



bool __fastcall TMyFtp::ChangeDirCustom(System::AnsiString *S)

{

  AnsiString Temp = *CustomToFileName(S);

  return ChangeDir(&amp;Temp);

}



bool __fastcall 
TMyFtp::CreateDirectory(AnsiString S)

{

  return FtpCreateDirectory(FFtpHandle, S.c_str());

}



bool __fastcall TMyFtp::RemoveDir(System::AnsiString S)

{

  return FtpRemoveDirectory(FFtpHandle, S.c_str());

}



bool __fastcall 
TMyFtp::RemoveDirCustom(System::AnsiString S)

{

  AnsiString Temp = *CustomToFileName(&amp;S);

  return RemoveDir(Temp);

}



bool __fastcall TMyFtp::BackOneDir(void)

{

  AnsiString S;

  S = FCurDir;

  S = StripLastToken(S, `/');

  if (S == 
`/')

  {

    return FALSE;

  }



  if (S.Length() != 0)

  {

    ChangeDir(&amp;S);

  }

  else

  {

    S = `/';

    ChangeDir(&amp;S);

  }

  return TRUE;

}



bool __fastcall TMyFtp::DeleteFile(System::AnsiString S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -