Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с FTP сервером, проблемы с отправкой файлов по FTP 
:(
    Опции темы
XavierElf
  Дата 24.1.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Написал я значит DLL для обмена с FTP серверами и при отладке столкнулся с проблемами:
есть такая функция в DLL:
Код

extern "C" __declspec(dllexport)
BOOL PutFOnFTP(LPCONNECTION_PARAMS lpftpConParams,
              LPCTSTR lpszLocalFile,
              LPCTSTR lpszRemoteDir,
              LPCTSTR lpszRemoteFile)
{
    strcpy(lpszRemoteNewPath, lpszRemoteRootPath);
    strcat(lpszRemoteNewPath, lpszRemoteDir);
    if(!FtpSetCurrentDirectory(lpftpConParams->hFTPSession, lpszRemoteNewPath))
    {
        MessageBox(NULL, "Не удалось установить директорию", "Ошибка", MB_OK);
        return FALSE;
    }
    if (!FtpPutFile(lpftpConParams->hFTPSession, 
                   lpszLocalFile,
                   lpszRemoteFile,
                   FTP_TRANSFER_TYPE_BINARY,
                   (DWORD)0))
    {
        MessageBox(NULL, "Не удалось загрузить файл  на сервер", "Ошибка", MB_OK);
        return FALSE;
    }
    if(!FtpSetCurrentDirectory(lpftpConParams->hFTPSession, lpszRemoteRootPath))
    {
        MessageBox(NULL, "Не удалось установить корневую директорию", "Ошибка", MB_OK);
        return FALSE;
    }
    return TRUE;
}


Клиент на Delphi вызывает её так:
Код

function PutFOnFTP(lpftpConParam: PConnectionParam;
  lpszLocalFile, lpszRemoteDir,
  lpszRemoteFile: LPCTSTR): BOOL; cdecl; external 'FtpExchange.dll';
...
...
procedure TForm1.btn1Click(Sender: TObject);
begin
...
...
  if PutFOnFTP(pCP, 'c:\file1.txt', '/test', 'file1.txt') then
    ShowMessage('File 1 sended')
  else
    ShowMessage('File 1 not send');
  if PutFOnFTP(pCP, 'c:\file2.txt', '/test', 'file2.txt') then
    ShowMessage('File 2 sended')
  else
    ShowMessage('File 2 not send');
  if PutFOnFTP(pCP, 'c:\file3.txt', '', 'file.txt') then
    ShowMessage('File 3 sended')
  else
    ShowMessage('File 3 not send');
end;

В итоге выполнения программы получаем:
1 запуск программы:
        Все файлы отправлены.
2 запуск программы:
        Ни один файл не отправляется, однако первый файл на сервере очищается.
3 запуск программы:
        1-й файл отправляется, остальные нет.
... далее повторяются 2-й и 3-й запуски.
Подскажите, как сделать чтобы файл нормально перезаписывался?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
_hunter
Дата 24.1.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



перед записью файла вызывай FtpOpenFile() -- провериш есть файл или нету. если есть -- вызывай 
FtpDeleteFile()


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
XavierElf
Дата 24.1.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



хмм... а не подскажете, как удалить файл, когда он открыт функцией FtpOpenFile()... точнее как закрыть открытый файл? я попробовал сделать, как Вы сказали, однако FtpDeleteFile() возвращает постоянно FALSE, так как файл в это время открыт...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
_hunter
Дата 24.1.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



InternetCloseHandle()


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
XavierElf
Дата 25.1.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Сделал таким образом, однако все равно не получается... Подскажите, что не так?
Код

extern "C" __declspec(dllexport)
BOOL PutFOnFTP(LPCONNECTION_PARAMS lpftpConParams,
              LPCTSTR lpszLocalFile,
              LPCTSTR lpszRemoteDir,
              LPCTSTR lpszRemoteFile)
{
    strcpy(lpszRemoteNewPath, lpszRemoteRootPath);
    strcat(lpszRemoteNewPath, lpszRemoteDir);
    if(!FtpSetCurrentDirectory(lpftpConParams->hFTPSession, lpszRemoteNewPath))
    {
        MessageBox(NULL, "Не удалось установить директорию", "Ошибка", MB_OK);
        return FALSE;
    }
    if ((hFileExists = FtpOpenFile(lpftpConParams->hFTPSession,
                              lpszRemoteFile,
                              GENERIC_WRITE,
                              FTP_TRANSFER_TYPE_BINARY,
                              (DWORD)0)))
    {
        InternetCloseHandle(hFileExists);
        if    (!FtpDeleteFile(lpftpConParams->hFTPSession,
                            lpszRemoteFile))
        {
            MessageBox(NULL, "Не удалось удалить файл", "Ошибка", MB_OK);
            return FALSE;
        }
    }
    if (!FtpPutFile(lpftpConParams->hFTPSession, 
                   lpszLocalFile,
                   lpszRemoteFile,
                   FTP_TRANSFER_TYPE_BINARY,
                   (DWORD)0))
    {
        MessageBox(NULL, "Не удалось загрузить файл  на сервер", "Ошибка", MB_OK);
        return FALSE;
    }
    if(!FtpSetCurrentDirectory(lpftpConParams->hFTPSession, lpszRemoteRootPath))
    {
        MessageBox(NULL, "Не удалось установить корневую директорию", "Ошибка", MB_OK);
        return FALSE;
    }
    return TRUE;
}

--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
_hunter
Дата 25.1.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



дык что именно не получается? что функция возвращает? что GetLastError() говорит?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
XavierElf
Дата 25.1.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Исключение возникает в функции  
Код

if (!FtpPutFile(lpftpConParams->hFTPSession, 
                   lpszLocalFile,
                   lpszRemoteFile,
                   FTP_TRANSFER_TYPE_BINARY,
                   (DWORD)0))
    {
        MessageBox(NULL, "Не удалось загрузить файл  на сервер", "Ошибка", MB_OK);
        return FALSE;
    }

То есть выскакивает мессага "Не удалось загрузить файл  на сервер". По сути файл который пытаюсь удалить - не удаляется, однако функция удаления возвращает TRUE. Не пойму, почему...  smile 
А при отправке следующих ф-лов выдает вообще - "Не удалось установить директорию"...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
_hunter
Дата 25.1.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



Цитата(XavierElf @  25.1.2007,  16:35 Найти цитируемый пост)
 выскакивает мессага "Не удалось загрузить файл  на сервер". По сути файл который пытаюсь удалить - не удаляется

стоп. так удалить не получается или залить?
в любом случае что GetLastError() говорит?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
XavierElf
Дата 25.1.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Так, GetLastError возвращает код 12002 в функции FtpPutFile(...) что обозначает ERROR_INTERNET_TIMEOUT. Почему - не понятно...  smile 
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
_hunter
Дата 25.1.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



странно... а какой-нить FTP-клиент удалить этот же файл может?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
XavierElf
Дата 25.1.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Удалить может. Пробовал тоталом. Однако если в тотале попробовать перезаписать - тоже повисает... Непонятно...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
_hunter
Дата 25.1.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



жначит ты перед перезаписью (FtpPutFile()) файл не удаляеш...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
XavierElf
Дата 25.1.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Млин, ну я же привел код функции отправки файлов на FTP и там должна указана функция, удаляющая файл, если он существует, только она почему-то не удаляет его...

Добавлено @ 18:12 
Сейчас выдает расширенный код интернет ошибки 12003 -> Код 425 Can't build data connection...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
_hunter
Дата 25.1.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



так может FtpOpenFile() почему-то не срабатывает. или FtpDeleteFile().
после удаления еще раз FtpOpenFile() вызови -- что будет?
да и просто по коду отладчиком пройдись (а не по MessageBox' ам ориентируйся)...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
XavierElf
Дата 25.1.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Так, при отправке второго файла выдает ошибку. Используя InternetGetLastResponseInfo(...) получил:
Код

200 Type set to I
200 Type set to I
200 PORT command successful.

Чёт непонятно, что за тип I и почему при удачной команде PORT возникает ошибка...

Это сообщение отредактировал(а) XavierElf - 25.1.2007, 18:52
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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