Ошибка при использовании Ftpgetfile() и структуры Win32_find_data

Тема в разделе "MS Visual C++", создана пользователем 111111, 28 апр 2009.

Статус темы:
Закрыта.
  1. 111111

    111111 Гость

    Прошу помощи. Я использую Visual C++ 9.0.

    Вот код:
    Код (Text):
    HINTERNET hInternet=::InternetOpen(TEXT("Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)"),
    INTERNET_OPEN_TYPE_PRECONFIG,
    NULL,NULL,
    0);
    DWORD_PTR asd=0;   
    HINTERNET hConnect = ::InternetConnect(hInternet,TEXT("172.16.1.112"),INTERNET_DEFAULT_FTP_PORT,NULL,NULL,INTERNET_SERVICE_FTP,0(DWORD)0);
    WIN32_FIND_DATA sss;
    LPTSTR buffer111=TEXT("/ftproot");
    HINTERNET FileFTP;
    FileFTP=FtpFindFirstFile(hConnect,NULL,&sss,INTERNET_FLAG_NEED_FILE,0);
    if(FtpGetFile(hConnect,sss.cFileName,TEXT("C:\\123\\1.bin"),0,0,0,0))
    {
    cout<<"File Downloaded"<<std::endl;
    }
    else
    {
    cout<<"File Error"<<std::endl;

    }
    Постарался привести только нужный код.

    Все дело в том, что в данном варианте я все время получаю результат "File Error".

    Мне кажется, что все дело во втором параметре функции FtpGetFile, поскольку в случае подстановки имени файла ввиде
    Код (Text):
    TEXT("Имя файла")
    Программа прекрасно работает и файл загружается с сервера.

    В чем моя ошибка?

    Очень прошу помочь.
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Что возвращает GetLastError() смотрели?
     
  3. 111111

    111111 Гость

    С данной прблемой разобрался, вынеся последовательность команд скачивания файла с сервера в отдельную функцию.

    Код (Text):
    // ftp.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"
    #include <windows.h>
    #include <wininet.h>
    #pragma comment(lib,"wininet")

    #include <stdlib.h>
    #include <fstream>
    #include <iostream>
    using namespace std;
    void zapis(HINTERNET hConnect1,WIN32_FIND_DATA struktura)
    {
    TCHAR filenames[270]=TEXT("C:\\123\\");
    for(int i=0;i<256;i++)
    {
    filenames[i+7]=struktura.cFileName[i];
    }
    if(FtpGetFile(hConnect1,struktura.cFileName,filenames,0,0,0,0))
    {
    cout<<"File Downloaded"<<std::endl;

    }
    else
    {
    cout<<"File Error"<<std::endl;
    }
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    bool ok = false;
    HINTERNET hInternet=::InternetOpen(TEXT("Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)"),
    INTERNET_OPEN_TYPE_PRECONFIG,
    NULL,NULL,
    0);
    if (hInternet != NULL)
    {
    // открываем FTP сессию
    DWORD_PTR asd=0;   
    HINTERNET hConnect =
    ::InternetConnect(
    hInternet,
    TEXT("192.168.131.134"),
    INTERNET_DEFAULT_FTP_PORT,
    NULL,NULL,
    INTERNET_SERVICE_FTP,
    0,
    (DWORD)0);

    if (hConnect != NULL)
    {
    cout<<"yes"<<std::endl;
    WIN32_FIND_DATA sss;
    WIN32_FIND_DATA aaa;
    LPTSTR buffer111=TEXT("/ftproot");

    if(FtpSetCurrentDirectory(hConnect,buffer111))
    {
    HINTERNET FileFTP;
    FileFTP=FtpFindFirstFile(hConnect,TEXT("*.bin"),&sss,INTERNET_FLAG_NEED_FILE,0);                 
    if(FileFTP!=NULL)
    {
    cout<<"New files are on server"<<std::endl;
    //char* qsc="C:\\123\\";
    //TCHAR csq[10];
    //::WideCharToMultiByte(1251, MB_PRECOMPOSED, qsc, -1, csq, 10);

    //TCHAR namefiled[270];
    //*namefiled=*csq + *sss.cFileName;
    BOOL Uslovie=TRUE;
    while(Uslovie)
    {
    zapis(hConnect,sss);
    if(InternetFindNextFile(FileFTP,&sss)==TRUE) Uslovie=TRUE;
    else Uslovie=FALSE;
    }

    cout<<"File END"<<std::endl;



    }
    else
    {

    cout<<"NO"<<std::endl;
    DWORD WINAPI asdf=GetLastError();
    cout<<asdf;
    }

    }
    else cout<<"no";
    }
    else
    {
    cout<<"no";

    }

    // закрываем сессию
    ::InternetCloseHandle(hConnect);
    }
    // закрываем WinInet
    ::InternetCloseHandle(hInternet);




    return 0;
    }
    GetLastError() выдавала ошибку в соединении на стороне сервера (точный код не помню). Она возникала из-за того, что вместо имени файла на сервер посылалась точка. Такого файла естественно не существовало, и сервер разрывал соединение.
    Почему данная проблема решилась созданием функции - не знаю.

    Но возникла новая проблема. Может кто-нибудь раньше сталкивался.

    Дело в том, что в начале программа работает в целом нормально. Т.е. при скачивании первых 10 или 13 файлов с сервера. Файлы скачиваются в нужную мне папку с нужным именем. Но затем, при скачивании 11 или 14 файла программа может или зависнуть или отправить всю систему в перезагрузку. При установки точки останова на строке
    Код (Text):
    if(FtpGetFile(hConnect1,struktura.cFileName,filenames,0,0,0,0))
    Оказалось, что все параметры передаваемые в функцию, верные (т.е. именно те значения, которые и должны быть). (Мне кажется, что некорректное поведение программы вызвано именно этой строкой, т.к. это последняя фукция, которая вызывается перед зависанием или перезагрузкой). Более того, по записям логов сервера оказалось, что при запросе последнего файла (того, на котором происходит сбой) корректно происходит запрос размера этого файла и начинается его скачка, но успешно она не заканчивается, т.к. система или перезагружается, или сервер разрывает соединение по завершению тайм-аута.

    В случае, когда происходит перезагрузка данный файл вообще не записывается на диск. А если программа "виснет", то файл на диск все же записывается, но не весь, а только первые 4 Кb. При этом открыть файл при запущенной программе невозможно, т.к. он уже открыт в монопольном режиме моей программой, т.е. похоже, что она пытается записать в него информацию.

    Я не могу понять в чем причина некорректной работы прграммы.
    Если кто-нибудь может подсказать чем вызваны такие ошибки, прошу помочь.
     
  4. 111111

    111111 Гость

    С проблемой разобрался. Оказалось, что ошибки в работе возникают только в том случае, если сервер локальный.
    Кстати, никто не знает почему так?
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей