Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как общаться с FTP-сервером, при помощи IDFTP->SendCMD(); 
:(
    Опции темы
AndAnd
Дата 5.2.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 22.7.2006

Репутация: нет
Всего: 1



Пробовал получить список директорий с FTP-сервера, но сервер ругается. Вобщем есть следующие вопросы:
1)В какой последовательности посылать команды?(особенно при подключении)
2)Как скопировать файл с FTP, а именно как указать серверу куда копировать
3)При отправке команды PORT ..... Как определить, что должно быть вместо точек. smile

Искал данную тему на данном форуме, но ничего к сожелению не нашел, также как и примеров в ИНЕТЕ.
вот код, исполузует компонент IdFTP:

Код

void TForm1::IDFTPConnection(AnsiString addr,AnsiString UserName,AnsiString Password)
{
 TMemo *Memo1=new TMemo(ToolBar4);
 Memo1->Parent=ToolBar4;
 Memo1->Width = ToolBar4->Width;
 Memo1->ScrollBars = ssVertical;

 Form1->IdFTP1->Port = 21;
 Form1->IdFTP1->User = UserName;
 Form1->IdFTP1->Password = Password;
 Form1->IdFTP1->Host = addr;


 Form1->IdFTP1->Connect();
 bool  con;
 con = Form1->IdFTP1->Connected();

Form1->IdFTP1->SendCmd("USER " + UserName ); 
Memo1->Lines->Add(Form1->IdFTP1->CmdResult); //сервер говорит, что пользователь уже зашел

 Form1->IdFTP1->SendCmd("PWD");
 Memo1->Lines->Add(Form1->IdFTP1->CmdResult);
  Form1->IdFTP1->SendCmd("PORT /*не знаю что здесь должно быть и как это определить*/");
 Memo1->Lines->Add(Form1->IdFTP1->CmdResult);
 Form1->IdFTP1->TransferType = ftASCII;
 Memo1->Lines->Add(Form1->IdFTP1->CmdResult);
 Form1->IdFTP1->SendCmd("LIST");
 Memo1->Lines->Add(Form1->IdFTP1->CmdResult);
 Form1->IdFTP1->Disconnect();


P.S.:Сервер стоит на UNIX Type:L8

Помогите, пожалуйста.
PM MAIL   Вверх
Anikmar
Дата 5.2.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



После установления соединения с сервером я использовал следующую конструкцию:
Код

bool TF_Main::SendToFtp(AnsiString FromFile, AnsiString ToFile)
{
    AnsiString AFile;
    bool Ret = true;
    int OldStatus;

    FileProcessCount = 0;
    WorkPercent = 0;

    CurrentFile = FromFile;
    CurrentFileSize = FileSizeByName(FromFile);

    AFile = ExtractFileName(ToFile);
    try
    {
        OldStatus = CurrentStatus;
        CurrentStatus = stPutFile;
        IdFTP_Define->Put(FromFile,AFile,false);
        F_Journal->AddNotify(AFile + " на FTP передан успешно ");
    }
    catch(...)
    {
        F_Journal->AddErrMes("Не удалось передать на FTP " + AFile);
        Ret = false;
    }
    CurrentStatus = OldStatus;
    return Ret;
}


Это кусок моей проги - там куча всяких украшательств, но основной метод - это IdFTP_Define->Put(FromFile,AFile,false);

Единственное замечание: надо находится в той директории на FTP, куда писать файл. Насколько я понял имя с путем данный метод не понимает.
PM MAIL ICQ   Вверх
AndAnd
Дата 6.2.2007, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 22.7.2006

Репутация: нет
Всего: 1



to Anikmar, а как ты подключаешься? Можешь показать код и как с ФТП копируешь (как устанавливать директорию у себя на компьютере куда файл будет копироваться)?
PM MAIL   Вверх
Anikmar
Дата 6.2.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Устанавливаю соединение я так:
Код

bool TF_Main::SetConnect(void)
{
    bool Ret = true;

    F_Journal->AddNotify("Устнавливаю соединение с сервером " +
        LE_HostName->Text + " Id:" +
        LE_UserID->Text);

    IdFTP_Define->Host = LE_HostName->Text;
    IdFTP_Define->User = LE_UserID->Text;
    IdFTP_Define->Password = LE_Password->Text;

    try
    {
        CurrentStatus = stConnectProcess;
        IdFTP_Define->Connect(true);
        F_Journal->AddNotify("Соединение успешно установлено");
    }
    catch(EIdProtocolReplyError &Err)
    {
        F_Journal->AddErrMes("Ошибка ответа сервера: " +
            AnsiString(Err.ReplyErrorCode));
        F_Journal->AddErrMes(
            "Возможные причины: неправильное имя пользователя");
        Ret = false;
    }
    catch(...)
    {
        F_Journal->AddErrMes("Соединение с сервером не удалось");
        Ret = false;
    }

    if (Ret) CurrentStatus = stOnlineReady;
    else CurrentStatus = stOfflineReady;

    return Ret;
}


Разрываю так:
Код

bool TF_Main::Disconnect(void)
{
    bool Ret = true;

    try
    {
        CurrentStatus = stWorkProcess;
        IdFTP_Define->Disconnect();
        F_Journal->AddNotify("Отсоединение от сервера прошло успешно");
        CurrentStatus = stOfflineReady;
    }
    catch(...)
    {
        Ret = false;
        F_Journal->AddErrMes("Не удалось разорвать соединение");
    }

    return Ret;
}


Меняю директорию так:
Код

//---------------------------------------------------------------------------
// Метод: ChangeFTPDir
//===========================================================================
// Пытается сменить FTP директорию на указанную в пути файла
// Отбрасывает текущую (.\)
// При успехе (или пути нет) возращает истину
bool TF_Main::ChangeFTPDir(AnsiString ToFile)
{
    AnsiString APath;
    AnsiString CurDir;
    bool Ret = true;
    int FindSlash;
    int OldStatus;

    APath = ExtractFilePath(ToFile);

    if (APath == "") return true;

    do
    {
        CurDir = "";
        FindSlash = APath.Pos("\\");
        if (FindSlash == 0) CurDir = APath;
        else if (FindSlash > 1) CurDir = APath.SubString(1,FindSlash-1);

        if ((CurDir != "")&&(CurDir != "\\."))
        {
            try
            {
                OldStatus = CurrentStatus;
                CurrentStatus = stChangingDir;
                IdFTP_Define->ChangeDir(CurDir);
                F_Journal->AddNotify("Вошел в директорию " + CurDir);
            }
            catch(...)
            {
                F_Journal->AddErrMes("Не удалось войти в " + CurDir);
                Ret = false;
            }
            CurrentStatus = OldStatus;
        } // if ((CurDir != "")&&(CurDir != "\\."))
        if (FindSlash == 0) break;
        APath.Delete(1,FindSlash);
    } while (Ret); // do

    return Ret;
}


Этот код я делал года 4 назад, уже забыл что к чему...
Судя по всему в FTP нельзя сменить сразу несколько директорий (т.е. войти в ветку сразу) - надо входить по одной директории последовательно - поэтому у меня разбор пути сделан
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.