Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2015.04.05;
Скачать: [xml.tar.bz2];

Вниз

Проблема с InternetCloseHandle   Найти похожие ветки 

 
АндрейНН   (2010-06-01 12:22) [0]

Здравствуйте, пытаюсь с помощью функций WinInet закачать файл на ftp-сервер, делаю это так:

function TWinInetFTP.Put(Source, Dest, FileName: string; CreateFolder: boolean): boolean;
var FileStream: TFileStream;
begin
 Result := false;
 if FileName = "" then FileName := ExtractFileName(Source);
 try
   FileStream := TFileStream.Create(Source, fmOpenRead, 0);
   try
     Result := Put(FileStream, Dest, FileName, CreateFolder)
   finally
     FileStream.Free
   end
 except
   SetError("Put", "File stream read error", GetLastError)
 end
end;

function TWinInetFTP.Put(Stream: TStream; Dest, FileName: string;
 CreateFolder: boolean): boolean;
var
 TotalBytesWrite, BytesToWrite, BytesWrite: dword;
 buf: array of char;
begin
 Result    := false;
 Terminate := false;
 BytesWrite      := 0;
 TotalBytesWrite := 0;
 Stream.Position := 0;
 // здесь создание директории если это необходимо
 if Dest[1] <> "/" then Dest := "/" + Dest;
 if Dest[Length(Dest)] <> "/" then Dest := Dest + "/";
 if not SetCurDir(Dest) then
   if not CreateFolder then
     begin
     SetError("Put", "SetCurDir", GetLastError);
     Exit
     end
   else if not MakeDir(Dest) then Exit;
 // дальше собсно действия для выгрузки файла
 hFile := FtpOpenFile(hConnect, PChar(FileName), GENERIC_WRITE, 0, 0);
 if not Assigned(hFile) then
   SetError("Put", "FtpOpenFile", GetLastError)
 else
   try
     SetLength(buf, BufferSize - 1);
     with Stream do
     repeat
       Application.ProcessMessages;
       if Terminate then Exit;
       Seek(TotalBytesWrite, soFromBeginning);
       BytesToWrite := BufferSize;
       if BytesToWrite > Size - Position then BytesToWrite := Size - Position;
       ReadBuffer(buf[0], BytesToWrite);
       if not InternetWriteFile(hFile, @buf[0], BytesToWrite, BytesWrite)
       then
         begin
         SetError("Put", "InternetWriteFile", GetLastError);
         Break
         end;
       TotalBytesWrite := TotalBytesWrite + BytesWrite;
       if Assigned(FOnTransferEvent) then FOnTransferEvent(Self, Stream.Position)
     until Position = Size;
     Stream.Position := 0;
     Result := true
   finally
     buf := nil;
     MainForm.RichEdit.Lines.Append("Перед InternetCloseHandle");
     if not InternetCloseHandle(hFile) then {error} ;
     { на InternetCloseHandle виснет, то есть управление уже не возвращает }
     MainForm.RichEdit.Lines.Append("После InternetCloseHandle")
   end;
 MainForm.RichEdit.Lines.Append("Выход из процедуры "Put (Stream)"")
end;


То есть вызываю процедуру Put с именем файла в параметре, которая вызывает второй Put, обёртки для функций WinInet были сделаны для удобства (часто его использую + чтобы было хоть внешне похоже на Indy). Проблема в следующем - в день копируется достаточно много файлов, и примерно один раз на каждые 2000-3000 тысячи файлов программка зависает на вызове InternetCloseHandle (то бишь даже ошибку узнать не могу), в инете нашёл предложение как вариант использовать асинхронные вызовы и устанавливать свой таймаут на выполнение процедуры, но связываться с асинхронными вызовами не хотелось бы тем более что синхронные вполне устраивют кроме непонятного периодического зависания InternetCloseHandle.

Подскажите плиз что ещё можно попробовать и в чём в принципе может быть загвоздка?


 
Плохиш ©   (2010-06-01 23:20) [1]


> в инете нашёл предложение


> Подскажите плиз что ещё можно попробовать

Типа, это опрос такой бессмысленный?



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2015.04.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.001 c
15-1408554196
Пашка.
2014-08-20 21:03
2015.04.05
Зачем нужны Regexp-ы?


15-1405510044
Kerk
2014-07-16 15:27
2015.04.05
Behavior-driven development (BDD) в Delphi


15-1408605148
Ламот
2014-08-21 11:12
2015.04.05
Помогите опознать содержимое пож.


15-1408566603
Юрий
2014-08-21 00:30
2015.04.05
С днем рождения ! 21 августа 2014 четверг


4-1270793885
Kolan
2010-04-09 10:18
2015.04.05
Нe удается открыть вирт. ком-порт, работающий через usbser.sys





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский