![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по FtpGetFile
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]ОК. Баааааааааааааааааааааальшое спасибо за помощь. Премного благодарен. Вечером попробую.