powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / FTP clent. Не могу стянуть файл с сервака. В чем трабл?
9 сообщений из 9, страница 1 из 1
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33286177
Anton M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу понять в чем трабл. Создаю ftp соединение с серваком.
На запрос
BOOL temp = FtpGetFile ...
выдает постоянно FALSE, пришлось закомментить.
Хотел решить вопрос через Read(fileBuf, FILEBUFLEN) и Write(fileBuf, numBytes).
Выкидывает на эсепшне, даже не проходя serverFile = pFtpConnection->OpenFile(fileName);
Кто подскажет, что делать????



// BOOL temp = FtpGetFile(pFtpConnection, "F5154.txt", "F5154.txt", true, INTERNET_FLAG_RELOAD,FTP_TRANSFER_TYPE_BINARY,0);


CInternetSession sess(_T("MyProgram/1.0"));

CFtpConnection* pFtpConnection = NULL;
CInternetSessionEx* pSession;
address = "addr.com";
username = "user";
password = "passw";
CString fileName = "F5154.txt";
CString fileNameLocal = "F5154.txt";
CInternetFile* serverFile = NULL;
CFile localFile(fileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);

try
{
// Request a connection to ftp.microsoft.com. Default
// parameters mean that we'll try with username = ANONYMOUS
// and password set to the machine name @ domain name

pSession = new CInternetSessionEx(AfxGetApp()->m_pszAppName, 1, INTERNET_OPEN_TYPE_DIRECT, 0, 0, INTERNET_FLAG_DONT_CACHE);
pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 500);
pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES, 2);
pSession->EnableStatusCallback();
pFtpConnection = pSession->GetFtpConnection(address.c_str(), username.c_str(), password.c_str(), INTERNET_DEFAULT_FTP_PORT);

// use a file find object to enumerate files
CFtpFileFind finder(pFtpConnection);

// BOOL temp = FtpGetFile(pFtpConnection, "F5154.txt", "F5154.txt", true, INTERNET_FLAG_RELOAD,FTP_TRANSFER_TYPE_BINARY,0);
localPath = "C:\\Temp";
SetCurrentDirectory(localPath.c_str());


try {
serverFile = pFtpConnection->OpenFile(fileName);
ULONGLONG fileLength;
ULONGLONG currentProgress = 0;
ASSERT(serverFile);
const int FILEBUFLEN = 1024;
char fileBuf[FILEBUFLEN];
UINT numBytes;
short sent = 0;
while (numBytes = serverFile->Read(fileBuf, FILEBUFLEN)) {
if (!stopDownload) {
localFile.Write(fileBuf, numBytes);
currentProgress += FILEBUFLEN;
short toSend = static_cast<short>(100 * currentProgress/fileLength);
if (sent + 2 < toSend) {
sent = toSend;
}

} else
break;
}
serverFile->Close();
localFile.Flush();
localFile.Close();
if (stopDownload) {
if (!DeleteFile(fileName))
AfxMessageBox("Can't delete local file.");
}
}
catch (CInternetException* pEx) {
TCHAR sz[1024];
pEx->GetErrorMessage(sz, 1024);
string msg = "InternetException: ";
msg += sz;
AfxMessageBox(msg.c_str());
pEx->Delete();
if (serverFile)
serverFile->Close();
localFile.Close();
if (!DeleteFile(fileName))
AfxMessageBox("Can't delete local file.");
}
catch (...) {
AfxMessageBox("FTP Update: unhandled exception.");
if (serverFile)
serverFile->Close();
localFile.Close();
if (!DeleteFile(fileName))
AfxMessageBox("Can't delete local file.");
}

}
catch (CInternetException* pEx)
{
TCHAR sz[1024];
pEx->GetErrorMessage(sz, 1024);
printf("ERROR! %s\n", sz);
pEx->Delete();
}
...
Рейтинг: 0 / 0
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33286853
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton M.Не могу понять в чем трабл. Создаю ftp соединение с серваком. На запрос BOOL temp = FtpGetFile ... выдает постоянно FALSE,
А какая ошибка то?
FtpGetFile() это команда WinAPI. Она не делает исключений, поэтому ее ошибку через try{}catch не поймать.
Попробуй так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if(!FtpGetFile(hiFTP, RequestFileName, LocalFileName, FALSE,  0 , FTP_TRANSFER_TYPE_BINARY,  0 )) {
	// в том редком случае если проблема была локальной - переполнился диск или не смог перезаписать получаемый файл
	if((SystemError= GetLastError()) !=  0 ) Log(WinApiError(SystemError));

	// если ошибка связана с интернетными причинами
	InternetErrorMessageLength = sizeof(InternetErrorMessage);
	InternetGetLastResponseInfo(&InternetError, InternetErrorMessage, &InternetErrorMessageLength);
	InternetErrorMessage[InternetErrorMessageLength]= 0 ;
	Log(InternetErrorMessage);
	return FALSE;
}
Потом смотри что у тебя попало в лог и делай выводы.
...
Рейтинг: 0 / 0
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33288449
Anton M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, выснил в чем проблема! Оказывается он ругается на неправильный хэндл, передаваемый в FtpGetFile. GetLastError() = ERROR_INVALID_HANDLE.

Отсюда другая проблема-непонятно с чего он ругается на хэндл, т.к.:
Так я создаю соединение:

CFtpConnection* pFtpConnection = NULL;
CInternetSessionEx* pSession;

pSession = new CInternetSessionEx(AfxGetApp()->m_pszAppName, 1, INTERNET_OPEN_TYPE_DIRECT, 0, 0, INTERNET_FLAG_DONT_CACHE);
pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 500);
pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES, 2);
pSession->EnableStatusCallback();
pFtpConnection = pSession->GetFtpConnection(address.c_str(), username.c_str(), password.c_str(), INTERNET_DEFAULT_FTP_PORT);


FtpGetFile(pSession, fileName, fileName, FALSE, 0, FTP_TRANSFER_TYPE_BINARY, 0)
В чем же некорректность передаваемого хэндла???
...
Рейтинг: 0 / 0
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33289527
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton M.
pFtpConnection = pSession->GetFtpConnection(address.c_str(), username.c_str(), password.c_str(), INTERNET_DEFAULT_FTP_PORT);
FtpGetFile(pSession, fileName, fileName, FALSE, 0, FTP_TRANSFER_TYPE_BINARY, 0)
В чем же некорректность передаваемого хэндла???
В том, что туда надо передавать хендл FTP соединения, а не указатель на объект CInternetSessionEx.

FtpGetFile(pFtpConnection, fileName, fileName, FALSE, 0, FTP_TRANSFER_TYPE_BINARY, 0)
...
Рейтинг: 0 / 0
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33291768
Anton M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, помогите!
Ничего не пойму, всячески уже делал, и пытался закачать FtpGetFile и GetFile и качать побайтно, ничего не выходит.
Говорит мол хэнл эррор, а на мой взгляд все вероно.
Насчет последнего поста - на вход подавал pFtpConnection, все равно говорит ERROR HANDLE.


HINTERNET hInternetSession;
HINTERNET hInternetConnect;
DWORD dwContext;

hInternetSession = InternetOpen("Ftp download client", // agent
INTERNET_OPEN_TYPE_PRECONFIG, // access
NULL, NULL, 0); // defaults

LPCTSTR lpszDirectory="/";
BOOL CurDir = FtpSetCurrentDirectory(hInternetSession, lpszDirectory);

hInternetConnect = InternetConnect(hInternetSession, address.c_str),INTERNET_DEFAULT_FTP_PORT ,username.c_str(), password.c_str(), INTERNET_SERVICE_FTP, INTERNET_FLAG_HYPERLINK, dwContext);

BOOL dlFile = FtpGetFile(hInternetConnect,"ftp://ftp.xtrapilot.com/5154.txt","c:\F5154.TXT", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0);


dlFile опять 0! ПочемуУ??
...
Рейтинг: 0 / 0
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33291811
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>BOOL CurDir = FtpSetCurrentDirectory(hInternetSession, lpszDirectory);

BOOL CurDir = FtpSetCurrentDirectory( hInternetConnect , lpszDirectory);

>>BOOL dlFile = FtpGetFile(hInternetConnect,"ftp://ftp.xtrapilot.com/5154.txt",
>>"c:\F5154.TXT", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0);

"ftp://ftp.xtrapilot.com/5154.txt" - Это что ?


А вообще вот куски моего обучения работы с FTP. Как ни странно - работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#pragma once
#include <windows.h>
#include <wininet.h>
#include <vector>
#include <string>
#pragma comment(lib, "Wininet.lib")

typedef std::vector<std::string> vec_files_t;

class ZC_FTP {
  public:
    ZC_FTP();
   ~ZC_FTP();
  private:
    long        m_lngError;
    HINTERNET   m_hndInet;
    HINTERNET   m_hndFTP;
public:
    long        getError    (){return m_lngError;}
    bool        Connect     (const char*, const char*, const char*, INTERNET_PORT prt = INTERNET_DEFAULT_FTP_PORT);
    bool        Disconnect  ();
    bool        setDirectory(const char*);
    vec_files_t getListFiles();
    bool        getFile     (const char*, const char*);
    bool        putFile     (const char*, const char*);
    bool        deleteFile  (const char*);
};

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
#include "stdafx.h"
#include "ZC_FTP.hpp"

ZC_FTP::ZC_FTP(){
  m_lngError =  0 ;
  m_hndInet  =  0 ;
  m_hndFTP   =  0 ;
  
  m_hndInet  = InternetOpen(
     "ZC_FTP"
   , INTERNET_OPEN_TYPE_DIRECT
   , ""
   , ""
   ,  0 
  );
  if(! m_hndInet){m_lngError = GetLastError();}
}

ZC_FTP::~ZC_FTP(){
  if(m_hndFTP) InternetCloseHandle(m_hndFTP);
  if(m_hndInet)InternetCloseHandle(m_hndInet);
}

bool ZC_FTP::Connect(const char*url, const char*usr, const char*psw, INTERNET_PORT prt){
  if(! m_hndInet)  return false;
  if(! strlen(url)){m_lngError = -1000000001L; return false;}
  
  DWORD ret( 0 );
  m_hndFTP = InternetConnect(
     m_hndInet
   , url
   , prt
   , usr
   , psw
   , INTERNET_SERVICE_FTP
   ,  0 
   , (DWORD_PTR)&ret
  );
  if(! m_hndFTP){m_lngError = GetLastError(); return false;}
  return true;
}

bool ZC_FTP::Disconnect(){
  if(m_hndFTP){
    InternetCloseHandle(m_hndFTP);
    m_hndFTP =  0 ;
  }
  return true;
}

bool ZC_FTP::setDirectory(const char* dir){
  if(! m_hndFTP)return false;
  BOOL r = FtpSetCurrentDirectory(
     m_hndFTP
   , dir
  );
  if(! r){m_lngError = GetLastError(); return false;}
  return true;
}

vec_files_t ZC_FTP::getListFiles(){
  vec_files_t files;
  if(m_hndFTP){
    WIN32_FIND_DATA FindFileData;
    DWORD           ret( 0 );
    HINTERNET hFile = FtpFindFirstFile(
       m_hndFTP
     , "*.*"
     , &FindFileData
     , INTERNET_FLAG_RELOAD
     , (DWORD_PTR)&ret
    );
    if(hFile){
      if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
        files.push_back(FindFileData.cFileName);
      }
 
      while (InternetFindNextFile(hFile,&FindFileData)){
        if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
          files.push_back(FindFileData.cFileName);
        }
      }
      InternetCloseHandle(hFile);
  } }
  return files;
}

bool ZC_FTP::getFile(const char* src, const char* dst){
  if(! m_hndFTP)return false;

  DWORD ret( 0 );
  BOOL r = FtpGetFile(
     m_hndFTP
   , src
   , dst
   , false
   , FILE_ATTRIBUTE_NORMAL
   , FTP_TRANSFER_TYPE_BINARY
   , (DWORD_PTR)&ret
  );
  if(! r){m_lngError = GetLastError(); return false;}
  return true;
}

bool ZC_FTP::putFile(const char* src, const char* dst){
  if(! m_hndFTP)return false;

  DWORD ret( 0 );
  BOOL r = FtpPutFile(
     m_hndFTP
   , src
   , dst
   , FTP_TRANSFER_TYPE_BINARY
   , (DWORD_PTR)&ret
  );
  if(! r){m_lngError = GetLastError(); return false;}
  return true;
}

bool ZC_FTP::deleteFile(const char* src){
  if(! m_hndFTP)return false;

  BOOL r = FtpDeleteFile(
     m_hndFTP
   , src
  );
  if(! r){m_lngError = GetLastError(); return false;}
  return true;
}
...
Рейтинг: 0 / 0
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33291838
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton M.Насчет последнего поста - на вход подавал pFtpConnection, все равно говорит ERROR HANDLE.
Ааааа... там наверное надо что-то вроде pFtpConnection->Handle подавать :)

А по поводу этого куска, в общем все правильно. Кроме одного:
Код: plaintext
BOOL dlFile = FtpGetFile(hInternetConnect,"ftp://ftp.xtrapilot.com/5154.txt","c:\F5154.TXT", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY,  0 );
А должно быть:
Код: plaintext
BOOL dlFile = FtpGetFile(hInternetConnect,"5154.txt","c:\F5154.TXT", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY,  0 );
...
Рейтинг: 0 / 0
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33292785
Anton M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZrenBy>>BOOL CurDir = FtpSetCurrentDirectory(hInternetSession,
...

Spasibo, pomoglo!
...
Рейтинг: 0 / 0
FTP clent. Не могу стянуть файл с сервака. В чем трабл?
    #33292793
Anton M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Anton M.Насчет последнего поста - на вход подавал pFtpConnection, все равно говорит ERROR HANDLE.
Ааааа... там наверное надо что-то вроде pFtpConnection->Handle подавать :)

А по поводу этого куска, в общем все правильно. Кроме одного:
Код: plaintext
BOOL dlFile = FtpGetFile(hInternetConnect,"ftp://ftp.xtrapilot.com/5154.txt","c:\F5154.TXT", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY,  0 );
А должно быть:
Код: plaintext
BOOL dlFile = FtpGetFile(hInternetConnect,"5154.txt","c:\F5154.TXT", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY,  0 );


Toje spasibo bolshoe!
A vot naschet pFtpConnection->m_hConnection идея хорошая, но есть загвоздка m_hConnection стоит в protected в afxinet.h, поэтому его не видать из моего класса ... =)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / FTP clent. Не могу стянуть файл с сервака. В чем трабл?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]