mainform.cpp
来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 524 行 · 第 1/2 页
CPP
524 行
{
Log((AnsiString)"Failed to delete \"" + ((TElSftpFileInfo*)(lvFiles->Selected->Data))->Name + "\", " +
e.Message, true);
}
Refresh();
}
}
}
//---------------------------------------------------------------------------
void TfrmMain::Download(void)
{
if (SftpClient->Active && (lvFiles->Selected != NULL) && (lvFiles->Selected->Data != NULL) &&
(!((TElSftpFileInfo *)(lvFiles->Selected->Data))->Attributes->Directory))
{
SaveDialog->FileName = ((TElSftpFileInfo *)(lvFiles->Selected->Data))->Name;
if (SaveDialog->Execute())
{
Log("Downloading file " + ((TElSftpFileInfo *)(lvFiles->Selected->Data))->Name);
frmProgress->lDestFileName->Caption = SaveDialog->FileName;
frmProgress->lProgress->Caption = "";
frmProgress->pbProgress->Position = 0;
frmProgress->Canceled = false;
frmProgress->Caption = "Download";
frmProgress->Show();
try
{
SftpClient->DownloadFile(FCurrentDir + "/" + ((TElSftpFileInfo *)(lvFiles->Selected->Data))->Name, SaveDialog->FileName);
Log("Download finished");
}
catch (Exception & E)
{
Log("Error during download: " + E.Message, true);
}
}
}
}
//---------------------------------------------------------------------------
void TfrmMain::Upload(void)
{
AnsiString shortName;
if (SftpClient->Active)
{
if (OpenDialog->Execute())
{
Log("Uploading file " + OpenDialog->FileName);
shortName = Sbutils::ExtractFileName(OpenDialog->FileName);
frmProgress->lDestFileName->Caption = FCurrentDir + "/" + shortName;
frmProgress->lSourceFilename->Caption = OpenDialog->FileName;
frmProgress->Canceled = false;
frmProgress->Caption = "Upload";
frmProgress->Show();
try
{
SftpClient->UploadFile(OpenDialog->FileName, FCurrentDir + "/" + shortName);
Log("Upload finished");
}
catch (Exception& E)
{
Log("Error during upload: " + E.Message, true);
}
Refresh();
}
}
}
//---------------------------------------------------------------------------
void TfrmMain::ChangeDir(void)
{
AnsiString DirHandle;
if ((lvFiles->Selected != NULL) && (lvFiles->Selected->Data != NULL) &&
(((TElSftpFileInfo*)(lvFiles->Selected->Data))->Attributes->Directory))
{
Log((AnsiString)"Changing directory to " + ((TElSftpFileInfo*)(lvFiles->Selected->Data))->Name);
try
{
DirHandle = SftpClient->OpenDirectory(FCurrentDir + "/" + ((TElSftpFileInfo*)(lvFiles->Selected->Data))->Name);
}
catch(Exception &e)
{
Log((AnsiString)"Unable to change directory: [" + e.Message + "]", true);
return;
}
try
{
SftpClient->CloseHandle(DirHandle);
FCurrentDir = SftpClient->RequestAbsolutePath(FCurrentDir + "/" + ((TElSftpFileInfo*)(lvFiles->Selected->Data))->Name);
}
catch(Exception &e)
{
FCurrentDir = ".";
}
Refresh();
}
}
//---------------------------------------------------------------------------
int __fastcall FileListSort(void* Item1, void* Item2)
{
TElSftpFileInfo* Info1 = (TElSftpFileInfo*)Item1;
TElSftpFileInfo* Info2 = (TElSftpFileInfo*)Item2;
if (Info1->Attributes->Directory == Info2->Attributes->Directory)
return CompareText(Info1->Name, Info2->Name);
else
{
if (Info1->Attributes->Directory)
return -1;
else
return 1;
}
}
//---------------------------------------------------------------------------
void TfrmMain::Refresh(void)
{
ClearFileList();
if (!SftpClient->Active)
return;
try
{
FCurrentDir = SftpClient->RequestAbsolutePath(FCurrentDir);
}
catch(Exception &e)
{
FCurrentDir = ".";
}
lPath->Caption = FCurrentDir;
Log("Retrieving file list");
try
{
AnsiString dirHandle = SftpClient->OpenDirectory(FCurrentDir);
TList* dirList = new TList;
try
{
SftpClient->ReadDirectory(dirHandle, dirList);
dirList->Sort(FileListSort);
for (int i = 0; i<dirList->Count; i++)
{
TElSftpFileInfo* Info = new TElSftpFileInfo;
((TElSftpFileInfo*)(dirList->Items[i]))->CopyTo(Info);
TListItem* Item = lvFiles->Items->Add();
Item->Data = Info;
Item->Caption = Info->Name;
if (!Info->Attributes->Directory)
{
Item->SubItems->Add(IntToStr(Info->Attributes->Size));
Item->ImageIndex = 9;
}
else
{
Item->SubItems->Add("");
Item->ImageIndex = 8;
}
Item->SubItems->Add(DateTimeToStr(Info->Attributes->MTime));
Item->SubItems->Add(Info->Attributes->Owner);
Item->SubItems->Add(FormatRights(Info->Attributes));
}
}
__finally
{
delete dirList;
SftpClient->CloseHandle(dirHandle);
}
}
catch(Exception &e)
{
Log("Failed to retrieve file list");
return;
}
}
//---------------------------------------------------------------------------
void TfrmMain::Log(const AnsiString S, bool Error)
{
TListItem* Item = lvLog->Items->Add();
Item->Caption = TDateTime::CurrentDateTime();
Item->SubItems->Add(S);
if (Error)
Item->ImageIndex = 11;
else
Item->ImageIndex = 10;
}
//---------------------------------------------------------------------------
void TfrmMain::ClearFileList(void)
{
try
{
for (int i = 0; i<lvFiles->Items->Count; i++)
delete ((TElSftpFileInfo*)(lvFiles->Items->Item[i]->Data));
}
__finally
{
lvFiles->Items->Clear();
}
}
//---------------------------------------------------------------------------
AnsiString TfrmMain::FormatRights(TElSftpFileAttributes* Attributes)
{
AnsiString Result = "";
if (Attributes->Directory)
Result = Result + "d";
if (Attributes->UserRead)
Result = Result + "r";
else
Result = Result + "-";
if (Attributes->UserWrite)
Result = Result + "w";
else
Result = Result + "-";
if (Attributes->UserExecute)
Result = Result + "x";
else
Result = Result + "-";
if (Attributes->GroupRead)
Result = Result + "r";
else
Result = Result + "-";
if (Attributes->GroupWrite)
Result = Result + "w";
else
Result = Result + "-";
if (Attributes->GroupExecute)
Result = Result + "x";
else
Result = Result + "-";
if (Attributes->OtherRead)
Result = Result + "r";
else
Result = Result + "-";
if (Attributes->OtherWrite)
Result = Result + "w";
else
Result = Result + "-";
if (Attributes->OtherExecute)
Result = Result + "x";
else
Result = Result + "-";
return Result;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::SftpClientProgress(TObject *Sender,
__int64 Total, __int64 Current, bool &Cancel)
{
frmProgress->lProgress->Caption = "0 / " + IntToStr(Total);
frmProgress->pbProgress->Position = 0;
frmProgress->pbProgress->Position = Current * 100 / Total;
frmProgress->lProgress->Caption = IntToStr(Current) + " / " + IntToStr(Total);
Cancel = frmProgress->Canceled;
if ((Current == Total) || (frmProgress->Canceled))
{
frmProgress->Hide();
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?