Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по FtpGetFile


Страницы:   1 2 3 4 5 6

SortoVaritu ©   (2009-06-19 10:17:00) 

Вопрос в следующем. На FTP лежит несколько файлов. Эти несколько файлов являются разрезанным архивом rar. При использовании FTPGetFile файлы скачиваются на мой компьютер. НО при попытке их собрать в архив имеем ошибку контрольной суммы. Файлы по 100 МБ. Для доступа к FTP используется прокси. В чем может быть проблема?


Сергей М.   (2009-06-25 10:53:00) [21]

Что за ОС ? Какая версия Делфи ?


SortoVaritu   (2009-06-25 10:31:00) [22]

Результат точно такой же.
Access violation at adress 77C32A16 in module msvcrt.dll. Read of adress FFFFFFFF


Сергей М.   (2009-06-23 16:32:00) [23]

Ты уже код [78] изучил ? Опробовал на своих "больших" файлах ? Каковы результаты ?
Излагай подробно и дословно все что видишь при его выполнении ..


SortoVaritu   (2009-06-23 16:27:00) [24]

Хм. Тогда я вот думаю. Решится ли мой вопрос с разрывом сессии, если я буду использовать напрямую RETR вместо FTPGETFile.


Сергей М.   (2009-06-23 15:56:00) [25]

Конечно.
А как же иначе ?


SortoVaritu   (2009-06-23 15:52:00) [26]

Проще говоря FTPGetFile так же использует команду RETR для доступа к файлу.


Сергей М.   (2009-06-23 15:25:00) [27]


> у меня всегда такой мусор валяецца


И кому, как думаешь, интересно или приятно взирать на твой "мусор" ?

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


> Чем отличается запрос файла командой FTPGetFile и командой
> RETR


FTPGetFile неявно подает команду RETR, получает содержимое удаленного файла и записывает полученное содержимое в указанный тобой файл.


SortoVaritu   (2009-06-23 15:17:00) [28]

Вот кстати еще хотел спросить. Чем отличается запрос файла командой FTPGetFile и командой RETR.


SortoVaritu   (2009-06-23 15:12:00) [29]

За совет, спасибо. Это все я понимаю. То что лишний код оставил, так это у меня всегда такой мусор валяецца. Признаю. Только ведь InternetGetLastResponseInfo не выполняется даже. Софтина останавливается на ошибке памяти.


Сергей М.   (2009-06-23 15:03:00) [30]

Изучай:

function FtpCommand(
  hConnect: HINTERNET;
  fExpectResponse: BOOL;
  dwFlags: DWORD;
  lpszCommand: PChar;
  dwContext: DWORD;
  var hFtpCommand: HINTERNET): BOOL;
  stdcall; external 'wininet.dll' name 'FtpCommandA';

const
 url = ' ftp://ftp.freepascal.org/fpc/contrib/cross/linux/';

procedure TForm1.Button5Click(Sender: TObject);
var
 hInet, hFTPSession, hFile: HINTERNET;
 RCode, RTLen: Cardinal;
 RText: String;
begin
 hInet := InternetOpen('FTP', INTERNET_OPEN_TYPE_PROXY, '192.168.7.254:3128', nil, 0);
 Win32Check(Assigned(hInet));
 try
   hFTPSession := InternetConnect(hInet, 'ftp.freepascal.org', 21, nil, nil, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
   Win32Check(Assigned(hFTPSession));
   try
     Win32Check(FtpCommand(hFTPSession, True, FTP_TRANSFER_TYPE_BINARY, 'RETR /fpc/contrib/cross/linux/binutils-fpc-netware.spec', 0, hFile));
     try
       RTLen := 255;
       SetLength(RText, RTLen);
       RCode := 12003; // <-- бессмысленная строка !!!!
       Win32Check(InternetGetLastResponseInfo(RCode, PChar(RText), RTLen));
       SetLength(RText, RTLen);
       ShowMessage('Response code = ' + IntToStr(RCode) + #10#10'Response text is'#10#10 + RText)

// здесь обязан бытьанализ ответа сервера на команду
// и собственно чтение файла, если анализ показал, что сервер успешно выполнил команду !!

     finally
       InternetCloseHandle(hFile);
     end;
   finally
     InternetCloseHandle(hFTPSession);
   end;
 finally
   InternetCloseHandle(hInet);
 end;
end;


Сергей М.   (2009-06-23 14:05:00) [31]


> он не бессмысленный. Он работает если команду выполнять
> LIST


Он бессмысленный при любойкоманде !
Ф-ция InternetGetLastResponseInfo не получает, а возвращаеткод ответа сервера !
За ккаким же лешим ты пишешь какое-то число в переменную err, если следом же вызываешь InternetGetLastResponseInfo, задача которой - изменитьзначение этой переменной в случае успешного выполнения ф-ции ?


SortoVaritu   (2009-06-23 12:21:00) [32]

Так он не бессмысленный. Он работает если команду выполнять LIST. Он мне в файл записывает содержимого каталога. РАБОТАЕТ.
НЕ РАБОТАЕТ при выполнении команды RETR.
В чем же он тогда бессмысленный.


SortoVaritu   (2009-06-23 12:21:00) [33]

Так он не бессмысленный. Он работает если команду выполнять LIST. Он мне в файл записывает содержимого каталога. РАБОТАЕТ.
НЕ РАБОТАЕТ при выполнении команды RETR.
В чем же он тогда бессмысленный.


Сергей М.   (2009-06-23 12:11:00) [34]


> Как он может быть успешен если прога даж не доходит до выполнения
> InternetGetLastResponseInfo
>


Вот как будет доходить, так и будем рассматривать работу InternetGetLastResponseInfo.

А пока это абсолютно бессмысленный код.


Сергей М.   (2009-06-23 12:10:00) [35]


> А он выполняется


А гдев твоем коде видно что выполняется или не выполняется ?
Почему я должен верить тебе на слово ?)


> 12003 значение взятое не от балды


А откуда ?)


> Да и причем тут это


А нашиша тогда ты демонстрируешь этот бестолковый код, не имеющий к проблеме отношения ?
И, наоборот, упрямо не приводишь код, имеющий непосредственное отношение к выяснению проблемы (анализ результатов вызовов API-функций и соотв.ветвления последующего алгоритма) ?


> выше упомянутая ошибка с памятью


Опять адрес забыл ?)


SortoVaritu   (2009-06-23 12:09:00) [36]

>И если вызов InternetGetLastResponseInfo успешен, где анализ значения, возвращенного этой ф-цией в переменную err ?

Как он может быть успешен если прога даж не доходит до выполнения InternetGetLastResponseInfo


SortoVaritu   (2009-06-23 12:01:00) [37]

12003 значение взятое не от балды.
Да и причем тут это.
Для того чтобы получить результат вызова InternetGetLastResponseInfo нужно чтобы FtpCommand1(hftp,true,FTP_TRANSFER_TYPE_BINARY   ,s ,0,phFile) выполнился. А он выполняется только с командой LIST. А с коммандой RETR нет. Что анализировать если команда не выполняется?


Сергей М.   (2009-06-23 11:46:00) [38]


> FtpCommand1(hftp,true,FTP_TRANSFER_TYPE_BINARY   ,s ,0,phFile);


И вновь нет анализа результата вызова API-функции, см.[12] !
Упрямство, достойное ослиного)


> err:=12003;
> InternetGetLastResponseInfo(err, @Msg, Len);


Это что за пляски с бубном ?

Что еще за "err:=12003" ? С какой луны свалилось число 12003 ?

Код ответа сервера следует получать (а не самому устанавливать от балды взятое значение !) лишь после успешного выполнения API-ф-ции, обращающейся к серверу.

И опять же - где анализ результата вызова InternetGetLastResponseInfo ?
И если вызов InternetGetLastResponseInfo успешен, где анализ значения, возвращенного этой ф-цией в переменную err ?

Когда ты наконец начнешь читать документацию, прежде чем что-то писать ?)


SortoVaritu   (2009-06-23 11:09:00) [39]

Итак. Что получилось.

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

s:=PChar('LIST') ;
FtpCommand1(hftp,true,FTP_TRANSFER_TYPE_BINARY   ,s ,0,phFile);
err:=12003;
InternetGetLastResponseInfo(err, @Msg, Len);
form1.memo1.lines.add(StrPas(@msg));

 begin
 AssignFile(LocalFile, ExtractFilepath(Application.exeName)+sRec .cFileName);
 {$i-}
 Rewrite(LocalFile, 1);
 {$i+}

 dwBytesRead := 0;
 bufsize := READ_BUFFERSIZE;

 while (bufsize > 0) do
 begin
   Application.ProcessMessages;

   if not InternetReadFile(phFile,
                           @buffer,
                           READ_BUFFERSIZE,
                           bufsize) then Break;
read
   if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then
     BlockWrite(LocalFile, buffer, bufsize);
   dwBytesRead := dwBytesRead + bufsize;
 CloseFile(LocalFile);

 end;

Но если команда не LIST а RETR. То выпрыгивает выше упомянутая ошибка с памятью.


SortoVaritu   (2009-06-22 15:27:00) [40]

ОК. Баааааааааааааааааааааальшое спасибо за помощь. Премного благодарен. Вечером попробую.


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо