Для начала
дадим возможность пользователю указывать адрес,
к которому будем подключаться. Поставим
выпадающий список 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(); |
|