📄 ch25.htm
字号:
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 "#pragma comment(lib,
"Inet.lib")" statement to the
// module that requires the lib.
// Add a "#pragma link "codebox.obj"" into the module that needs
// an obj.
///////////////////////////////////////
#include <vcl\vcl.h>
#include <wininet.h>
#pragma hdrstop
#pragma comment(lib, "Inet.lib")
#pragma link "codebox.obj"
#include "codebox.h"
#include "Ftp2.h"
__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("WinINet1", 0, NULL, 0, 0);
FFtpHandle = NULL;
FConnected = False;
}
void __fastcall TMyFtp::Connect(void)
{
AnsiString S;
AnsiString CR1("\x00D\x00A");
FContext = 255;
FFtpHandle =
InternetConnect(FINet, FServer.c_str(), 0,
FUserID.c_str(), FPassword.c_str(),
INTERNET_SERVICE_FTP, 0, FContext);
if (FFtpHandle == NULL)
{
S = "Connection failed" + CR1 +
"Server: " + FServer + CR1 +
"UserID: " + FUserID + CR1 +
"Password: " + FPassword;
throw Exception(S);
}
else
{
FConnected = True;
SetUpNewDir();
}
}
System::AnsiString __fastcall TMyFtp::GetCurrentDirectory(void)
{
DWORD Len = 0;
FtpGetCurrentDirectory(FFtpHandle, FCurDir.c_str(), &Len);
FCurDir.SetLength(Len);
FtpGetCurrentDirectory(FFtpHandle, FCurDir.c_str(), &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 <= NumDots; i++)
S = S + " ";
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->Insert(FindData.cFileName, 6);
Temp = IntToStr(FindData.nFileSizeLow);
S->Insert(Temp, 25);
return S;
}
Classes::TStringList* __fastcall
TMyFtp::FindFiles(void)
{
WIN32_FIND_DATA FindData;
HINTERNET FindHandle;
AnsiString Temp;
FCurFiles->Clear();
FindHandle = FtpFindFirstFile(FFtpHandle, "*.*", &FindData, 0, 0);
if (FindHandle == NULL)
{
return FCurFiles;
}
GetFindDataStr(FindData, &Temp);
FCurFiles->Add(Temp);
while (InternetFindNextFile(FindHandle, &FindData))
{
GetFindDataStr(FindData, &Temp);
FCurFiles->Add(Temp);
}
InternetCloseHandle(FindHandle);
return FCurFiles;
}
bool __fastcall TMyFtp::ChangeDir(System::AnsiString *S)
{
if(!FConnected)
throw Exception("You must connect first!");
if (S->Length() != 0)
if
(!FtpSetCurrentDirectory(FFtpHandle, S->c_str()))
{
ShowMessage("Could not change to: " + *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->Length() - PreSize;
Temp.SetLength(TempSize);
*S = StripFromFront(*S, PreSize);
memcpy(Temp.c_str(),
S->c_str(), TempSize);
*S = GetFirstToken(Temp, ` `);
return S;
}
bool __fastcall TMyFtp::ChangeDirCustom(System::AnsiString *S)
{
AnsiString Temp = *CustomToFileName(S);
return ChangeDir(&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(&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(&S);
}
else
{
S = `/';
ChangeDir(&S);
}
return TRUE;
}
bool __fastcall TMyFtp::DeleteFile(System::AnsiString S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -