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 + -
显示快捷键?