15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


ПРОГРАММА ОБМЕНА ДАННЫМИ ПО FTP ПРОТОКОЛУ


Автор - Sciba Alexander

Скачать исходник - 72Кб

Для начала дадим возможность пользователю указывать адрес, к которому будем подключаться. Поставим выпадающий список IDC_COMBO1 и две кнопки с заголовками Add и Del для добавления и удаления элементов списка соответственно. Чтобы пользователь мог только пользоваться списком и не мог писать по поле ввода списка, нужно задать свойству Type значение DropList. По нажатию на кнопку добавить напишем такой код:

void CWinFtpDlg::OnAdd() 
{
Dlg dlg; 

if(dlg.DoModal() == IDOK)
{
m_ftpAdress.AddString(dlg.m_string); // в конец списка 
// m_ftpAdress.InsertString(0, dlg.m_string); // в начало списка
}
flagDelAdd = true;
}

Здесь выводится диалоговое окно, в котором пользователь будет вводит нужный адрес. А мы его добавляем в конец списка. Если указать закомментированную строку - указанный адрес будет вставляться в начало списка. Диалоговое окно будет выглядеть вот так:

m_string - это переменная поля ввода строкового типа.

По нажатию на кнопку Del вставляем такой код:

void CWinFtpDlg::OnDel() 
{
m_ftpAdress.DeleteString(m_ftpAdress.GetCurSel());
flagDelAdd = true;
}

Здесь удаляется текущий элемент списка.

На кнопку подключения [Connect] напишем следующий код:

void CWinFtpDlg::OnConnect() 
{
flagConnect = true;
OnGo();
}

Далее добавим функцию-член к классу диалога OnGo() и опишем её так:

void CWinFtpDlg::OnGo() 
{
/*
if(flagIsConnected)
{
AfxMessageBox("Disconnect previous session (please)"); 
return;
}
*/
BOOL res;

if(flagConnect)
{
CString Login, Password;

static CInternetSession session;
m_ftpAdress.GetLBText(m_ftpAdress.GetCurSel(), str);
int k = str.Find(' ');
if(k >= 0)
str.Insert(k, '\0');
if(str == "172.17.168.170" || str == "172.17.168.171" || str == "172.17.168.172")
Login = Password = "expuser";
else
{
DlgLogin dlg;
if(dlg.DoModal() == IDOK)

Login = dlg.m_login;
Password = dlg.m_password;
}

cp = session.GetFtpConnection(str, Login, Password);
cp->GetCurrentDirectory(m_directory);
UpdateData(FALSE);
// CFtpFileFind cf(cp);
cf = new CFtpFileFind(cp);
flagConnect = false;
flagIsConnected = true;
flagApply = true;


//------------------------------ measure rate of transmission 

}
//-------------------------------------
if(flagGet)
{
int k=0;
for(int i=0; i<m_list.GetCount(); i++)
if(m_list.GetSel(i))
{
m_list.GetText(i, str);
k += cp->GetFile(str_list[i], m_directory2 + "/" + str, 
TRUE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 1);
}
if(k <= 1)
str.Format("%2d files was copied", k);
else
str.Format("%2d files were copied", k);
AfxMessageBox(str);
flagApply2 = true;
flagGet = false;
}
//------------------------------------- nash PC
if(flagApply2)
{
UpdateData(TRUE);
m_list2.ResetContent();
res = cff2->FindFile(m_directory2 + "/" + m_filemask2, 0);
res = cff2->FindFile(m_directory2 + "/" + m_filemask2, 0);
if(res)
{
nDir2=0;
nlist2 = 0;
//--------------------------------fill ListBox
while(cff2->FindNextFile())
{
str = cff2->GetFileName();
if(cff2->IsDirectory())
{
if(nlist2 > nDir2)
for(int k=nlist2-1; k>=nDir2; k--)
str_list2[k+1] = str_list2[k];
str_list2[nDir2] = str;
nlist2++;
str.MakeUpper();
m_list2.InsertString(nDir2++, str);
}
else
{
str_list2[nlist2++] = str;
str.MakeLower();
m_list2.AddString(str);
}
}
str = cff2->GetFileName();
if(cff2->IsDirectory())
{
if(nlist2 > nDir2)
for(int k=nlist2-1; k>=nDir2; k--)
str_list2[k+1] = str_list2[k];
str_list2[nDir2] = str;
nlist2++;
str.MakeUpper();
m_list2.InsertString(nDir2++, str);
}
else
{
str_list2[nlist2++] = str;
str.MakeLower();
m_list2.AddString(str);
}
}
flagApply2 = false;
}
//-------------------------------------
if(flagPut)
{
// UpdateData(TRUE);
// for(int i=0; i<m_list.GetSelCount(); i++)
int k=0;
for(int i=0; i<m_list2.GetCount(); i++)
if(m_list2.GetSel(i))
{
str = str_list2[i];
k += cp->PutFile(m_directory2 + "/" + str, m_directory + "/" + str, FTP_TRANSFER_TYPE_BINARY, 1);
}
if(k <= 1)
str.Format("%2d files was copied", k);
else
str.Format("%2d files were copied", k);
AfxMessageBox(str);
flagApply = true;
flagPut = false;
}
//------------------------------------- nash PC
if(flagApply)
{
UpdateData(TRUE);
cp->SetCurrentDirectory(m_directory); 
//AfxMessageBox(m_directory);
m_list.ResetContent();
res = cf->FindFile(m_directory + "/" + m_filemask, 0);
if(res)
{
nDir=0;
nlist = 0;
//--------------------------------fill ListBox
while(cf->FindNextFile())
{
str = cf->GetFileName();
if(cf->IsDirectory())
{
if(nlist > nDir)
for(int k=nlist-1; k>=nDir; k--)
str_list[k+1] = str_list[k];
str_list[nDir] = str;
nlist++;
str.MakeUpper();
m_list.InsertString(nDir++, str);
}
else
{
str_list[nlist++] = str;
str.MakeLower();
m_list.AddString(str);
}
}
str = cf->GetFileName();
if(cf->IsDirectory())
{
if(nlist > nDir)
for(int k=nlist-1; k>=nDir; k--)
str_list[k+1] = str_list[k];
str_list[nDir] = str;
nlist++;
str.MakeUpper();
m_list.InsertString(nDir++, str);
}
else
{
str_list[nlist++] = str;
str.MakeLower();
m_list.AddString(str);
}
}
//-------------------------------- qsort string
flagApply = false;
}
}

По нажатию на кнопку Apply удалённого компьютера пишем такой код:

void CWinFtpDlg::OnApply() 
{
if(!flagIsConnected)
return;
flagApply = true;
// flagApply2 = true;
OnGo();
}

По нажатию на кнопку Apply локального компьютера пишем такой код:

void CWinFtpDlg::OnApply2() 
{
flagApply2 = true; 
OnGo();
}

Обработчик кнопки Get должен выглядеть так:

void CWinFtpDlg::OnGet() 
{
if(!flagIsConnected)
return;
flagGet = true; 
OnGo();
}

А это код кнопки Put:

void CWinFtpDlg::OnPut() 
{
if(!flagIsConnected)
return;
flagPut = true; 
OnGo();
}

В заголовочном файле [.h] диалога должны быть объявлены следующие переменные:

CFtpConnection *cp;
bool flagConnect;
bool flagApply;
bool flagApply2;
bool flagGet;
bool flagPut;
bool flagDelAdd;
bool flagIsConnected;
void OnGo();
CFtpFileFind *cf;
CFileFind *cff2;
CString str;
CString *str_list, *str_list2;
int nlist, nlist2;
int nDir, nDir2;

Инициализируем их в файле реализации [.cpp] диалога следующим образом:

flagConnect = false;
flagApply = false;
flagApply2 = true;
flagGet = false; 
flagPut = false; 
flagDelAdd = false;
flagIsConnected = false;
cff2 = NULL;
cf = NULL;
cp = NULL;
str_list = new CString[5000];
str_list2 = new CString[5000];

А по инициализации диалога добавляем такой код:

FILE *fr = fopen("winftp.dan", "r");
if(fr)
{
char *buf = new char[256];
while(fgets(buf, 256, fr))
{
buf[strlen(buf)-1] = '\0';
//fscanf(fr, "%s", buf);
m_ftpAdress.AddString(buf);
}
}
cff2 = new CFileFind();