[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / C - C++ /

FTP клиент своими руками

Здраствуй, сечас я покажу, как в CBuilder можно создать свой простой FTP-клиент, похожий пример можно найти в документации C++Builder Developnet's Guilde.

Для этого нам понадобиться компонент NMFTP (со вкладки FastNet), кинь его на форму и для удобства дай ему имя MyFtp (хотя, в принципе, это на твое усмотрение). Нам еще будут нужны OpenDialog; SaveDialog; ImageList; - тоже кинь их на форму. Для ввода логина и пароля, а так же адреса сервера нам пригодиться три TextEdit.
Не забудь, так же, про три стандартные кнопки - Конект (дай имя StartButton); Стоп (присвой имя StopButton); Загрузка (задай имя - UploadButton).
Кроме этого нам надо будет где-то отображать файлы, которые находяться на сервере, для этого лучше всего подойдет TreeView (его найдешь на вкладке Win32) и также дадим ему свое имя, предположим - MyTree.
Задаем имена для компонентов - мы только ради удобства, если же тебе удобней использовать стандартные-длинные имена, то можешь использовать их (только не забудь, что в моем коде будут имена не стандартные). Интерфейс программы, у меня вышел такой:

Просто, но со вкусом =) . Компоненту Panel, на котором у меня разместились кнопки и TextEdit'ы, я присвоил значение Align=alTop. А для компонента TreeView Align=alClient.

Итак, первое что мы сделаем - это напишим событие onClick для кнопки конект:

MyFtp->Host = Edit3->Text; // Отправляем адрес сервера
MyFtp->UserID = Edit1->Text;
//Отправляем логина
MyFtp->Password = Edit2->Text;
//Отправляем пароль
MyFtp->Connect();
// И конект... пошло соединение...
StartButton->Enabled = false;
//Запрещаем повторное нажатие кнопки конект
StopButton->Enabled = true;
//Разрешаем нажатие кнопки стоп
MyTree->Items->Clear();
//Очищаем список файлов...
DoList();
//Запускаем функцию получения файлов и их отображания, ее мы рассмотрим ниже:

void __fastcall TForm1::DoList() //Итак, поехали:
{
TTreeNode *Temp, *Root;
int i;
TCursor Save_Cursor = Screen->Cursor;

Screen->Cursor = crHourGlass; // Запускаем песочные часики
Root = MyTree->Selected;
//Находим директорию
MyFtp->List();
MyTree->Items->BeginUpdate();
//Получаем наличие папок и файлов:
for(i=0;i<MyFtp->FTPDirectoryList->Attribute->Count;i++)
{
Temp =MyTree->Items->AddChild (Root,MyFtp->FTPDirectoryList->name->Strings[i]);
if((MyFtp->FTPDirectoryList->Attribute->Strings[i])[1] == 'd')
{
//Папки:
Temp->ImageIndex = 0;
Temp->SelectedIndex = 0;
}
else
{
//Файлы:
Temp->ImageIndex = 1;
Temp->SelectedIndex = 1;
}
}
MyTree->AlphaSort();
MyTree->Items->EndUpdate();
//Заканчиваем обонвление списка
if(Root)
Root->Expand(true);
Screen->Cursor = Save_Cursor;
}

Создадим событие для кнопки СТОП:

MyFtp->Disconnect(); //Разъединение
StartButton->Enabled = true;
//Кнопка Конект сного доступна
StopButton->Enabled = false;
//Кнопка Стоп запрещена

Кнопка Загрузка:

if(OpenDialog1->Execute()) //Открываем диалог и ищем файл для закачки
{
MyFtp->Upload (OpenDialog1->FileName,ExtractFileName(OpenDialog1->FileName));
// И, собственно, загружаем файл.
}


Наверно, тебя мучает вопрос (если нет, то задай его): на кой бес, на форме компонент ImageList ?!
Отвечаю - он-то и поможет нам визуально разобрать - где на MyTree файл, а где папка.
Необходимо в ImageList подгрузить два изображения, первый это картинка папки, второй картинка файла. После этих нехитрых манипуляций, выраем наш MyTree (TreeView) и в Events->Image->Укажите ImageList с изображениями. (вообще-то ImageList у нас один, так что не запутаетесь).

Далее мы проработаем интересную штуку - во время двойного клика на TreeView (MyTree) мы начнем сохранять выбраный файл, создайте событие OnDblClick и начнем:

if(MyTree->Selected->ImageIndex == 0)
//Если выбрана папка - то меняем диреторию:
{
if(MyTree->Selected->Count == 0)
{
MyFtp->ChangeDir(GetPath());
//Смена директрий, тут встречается еще одна функция - GetPath, она будет рассмотрена ниже
DoList();
//Отображаем файлы новой директории
}
}
else
//Если файл, то сохраним его:
{

AnsiString RemoteFile;
//Объявляем переменную RemoteFile
RemoteFile = GetPath();
//погоди.. мы рассмотрим эту функцию ниже
SaveDialog->FileName = MyTree->Selected->Text;
//Даем имя файлу
if(SaveDialog->Execute())
//Запукаем диалог и ищем путь, куда сохранять файл
MyFtp->Download(RemoteFile, SaveDialog->FileName);
//Сохранено
}

И как писалось в комментариях, функция GetPath(), комментировать я его не буду, ибо тут и все и без меня понятно:

AnsiString __fastcall TForm1::GetPath()
{
TTreeNode *Base, *Temp;
TStringList *TempList = new TStringList();
int i;
AnsiString ToReturn;

Base = MyTree->Selected;
TempList->Add(Base->Text);
Temp = Base->Parent;
while(Temp)
{
TempList->Add(Temp->Text);
Temp = Temp->Parent;
}
for(i=TempList->Count-1;i>-1;i--)
{
ToReturn += "/" + TempList->Strings[i];
}
return ToReturn;
}

Так, теперь мы должны проработать изменение картинок MyTree. Давай создаим новое событие OnCompare :

if(Node1->ImageIndex > Node2->ImageIndex) //Просто меняем картинки:
Compare = 1;
else
if(Node1->ImageIndex == Node2->ImageIndex)
Compare = CompareStr(Node1->Text, Node2->Text);
else
Compare = -1;


Ну, что, вот почти и готово, единственно - осталось рассписать все ошибки, что лишний раз не доводить пользователя до сердечного приступа. Для этого создадим для MyFtp (NMFTP) событие OnFailure (что в переводе с англ. - неспособность):

switch(Trans_Type)
{
case cmdChangeDir: ShowMessage("ChangeDir failed");
case cmdMakeDir: ShowMessage("MakeDir failed");
case cmdDelete: ShowMessage("Delete failed");
case cmdRemoveDir: ShowMessage("RemoveDir failed");
case cmdList: ShowMessage("List failed");

case cmdRename: ShowMessage("Rename failed");
case cmdUpRestore: ShowMessage("UploadRestore failed");
case cmdDownRestore: ShowMessage("DownloadRestore failed");
case cmdDownload: ShowMessage("Download failed");
case cmdUpload: ShowMessage("Upload failed");
case cmdAppend: ShowMessage("UploadAppend failed");
case cmdReInit: ShowMessage("Reinitialize failed");

case cmdAllocate: ShowMessage("Allocate failed");
case cmdNList: ShowMessage("NList failed");
case cmdDoCommand: ShowMessage("DoCommand failed");
case cmdCurrentDir: ShowMessage("CurrentDir failed");
}

Если будет время и желание можно перевести на русский, но по-мойму так лучше (или мне просто лень переводить самому). Так или иначе - клиент готов, его можно запускать и тестить. Только если чесно - скорость работы такого стандартного FTP клиента оставляют желать лучшего. Если возникнут какие либо вопросы - милости просим на наш форум.




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / C - C++ /

Пишем CD проигрыватель 2
28-05-2010   

Сейчас я покажу как можно написать простой проигрыватель CD дисков. Для начала разместим все нужные компоненты на форме (см. рисунок)... подробнее

Кол. просмотров: общее - 4170 сегодня - 2

Пишем браузер
28-05-2010   

Продолжаю тему клонирования программ darkamstera на Delphi в С++Builder. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке всеми-любимого InternetExplorer. Наш зверь сможет ходить по URL... подробнее

Кол. просмотров: общее - 2939 сегодня - 0

Информация о системе
28-05-2010   

Выводим информацию о нашей родненькой системе. Для получения большей части информации мы будем использовать обширные функции, это не так сложно, как может показатся с первого взгляда и вообще код довольно простой и примитивный, так что покапавшись в нем пару минут - можно в легкостью разобраться что к чему, зачем и как... подробнее

Кол. просмотров: общее - 2960 сегодня - 1

FTP клиент своими руками
28-05-2010   

Здраствуй, сечас я покажу, как в CBuilder можно создать свой простой FTP-клиент, похожий пример можно найти в документации C++Builder Developnets Guilde... подробнее

Кол. просмотров: общее - 3421 сегодня - 2

Работаем с POP-сервером
28-05-2010   

Здраствуй, в этой статье я расскажу про способы получения e-mail писем и их прочтения. Для начала давайте составим интерфейс будущей программы Вот, что у меня вышло... подробнее

Кол. просмотров: общее - 3011 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects