Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.02;
Скачать: CL | DM;

Вниз

скачивание файлов из интернета   Найти похожие ветки 

 
bagos   (2008-02-08 23:59) [0]

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


 
palva ©   (2008-02-09 00:53) [1]

Не очень понятно, что такое нормальная информация. Если нормальная информация отсутствует, то скорее всего ваши понятия о норме превратны. Для начала объясните, что такое "файлы в инете". С некоторой натяжкой можно говорить о файлах, лежащих на сервере FTP. Но скорее всего вы не это имели ввиду.


 
Riply ©   (2008-02-09 01:42) [2]

> [1] palva ©   (09.02.08 00:53)
> Не очень понятно, что такое нормальная информация.

Это код, готовый к копи/пайстному использованию.
С Вашим опытом, пора бы знать такие элементарные вещи :)


 
Германн ©   (2008-02-09 01:49) [3]


> Riply ©   (09.02.08 01:42) [2]
>
> > [1] palva ©   (09.02.08 00:53)
> > Не очень понятно, что такое нормальная информация.
>
> Это код, готовый к копи/пайстному использованию.
> С Вашим опытом, пора бы знать такие элементарные вещи :)
>

С его опытом - это бред. Да и с моим тоже. Поскольку копипасты в наше время не было в продаже. :)))


 
Riply ©   (2008-02-09 01:54) [4]

> [3] Германн ©   (09.02.08 01:49)
> С его опытом - это бред. Да и с моим тоже.
> Поскольку копипасты в наше время не было в продаже. :)))

Тогда вам с palva, ну просто очень срочно, нужно изучать
новейшие и моднейшие технологии программирования :)


 
guav ©   (2008-02-09 01:56) [5]

http://msdn2.microsoft.com/en-us/library/aa384363.aspx
InternetOpen + InternetConnect + InternetReadFile + InternetCloseHandle. Мне этот вариант нравится тем, что код одинаковый для http и ftp. WinInet это не единствнный вариант, но как по мне самый простой.


 
guav ©   (2008-02-09 02:02) [6]

Точнее я имел в виду InternetOpenUrl вместо InternetConnect , тогда действительно четырёх функций хватит.


 
Германн ©   (2008-02-09 02:04) [7]


> Riply ©   (09.02.08 01:54) [4]

Пока мне это не нужно - мне это не нужно.
P.S. Не сочти это за тавтологию.


 
bagos   (2008-02-09 02:05) [8]

спасибо, уже разобрался как всегда ответ на поверхности был))

скачиваю за раз по 20 и более файлов. сделал ведение лога в листбоксе, но пока файлы скачивыаются нчиего в листбокс не добавляется только при завершении всех закачек! :( пробовал в отдельном потоке тоже ничего не дало. как решать подобную проблему? хотелось бы видеть лог в процессе выполнения


 
palva ©   (2008-02-09 08:53) [9]

guav ©   (09.02.08 01:56) [5]
Спасибо за ссылку. Надо посмотреть эти функции. Может быть они решат такие темные для меня вопросы как докачка, автоматическое использование кэширования - это если скачиваешь картинку, которую только что открыл в эксплорере, прогресс бар при скачивании очень большого файла и т. д. Я обычно такими вещами не заморачиваюсь поэтому пользуюсь одним вызовом функции
unit UrlMon
function URLDownloadToFile

> спасибо, уже разобрался как всегда ответ на поверхности был))
Не стоит благодарности. Мы рады за вас. Жаль, что наши скромные попытки поучаствовать в ваших проблемах, не были вознаграждены, и мы не только не получили информации о вашем ноу хау, но даже не удостоились общения.

> как решать подобную проблему? хотелось бы видеть лог в процессе выполнения
Обычно, чтобы при выполнении некоторой работы поток все же отвлекался на работу с пользовательскими контролами периодически выполняют
Application.ProcessMessages;
Может быть, и вам поможет вызов этого метода.


 
bagos   (2008-02-09 13:48) [10]

ах да, я не стал заморачиваться и решение нашел в использовании idhttp.(в данном случае меня мне все равно какая реализация, главное чтобы скачивал).
http:=TIdHTTP.Create(nil);
memor:=TMemoryStream.Create;
 http.Get(s+listbox2.Items[ListBox2.ItemIndex],memor);
 memor.Position:=0;
 memor.SaveToFile(GetCurrentDir+"\downloads\"+s+".txt");


palva, Application.ProcessMessages; я так и не понял куда это вставлять.
в цикл или в любое место ппрограммы. а может в поток?или в файл проекта?
Благодарю за ответы!


 
ketmar ©   (2008-02-09 13:56) [11]

>[10] bagos (2008-02-09 13:48:00)
для индейцев — антифриз нужон. по крайней мере раньше был нужон, сейчас не в курсе.

---
Understanding is not required. Only obedience.


 
bagos   (2008-02-09 14:27) [12]

что есть "антифриз"?


 
ketmar ©   (2008-02-09 14:34) [13]

>[12] bagos (2008-02-09 14:27:00)
пошуруй мышкой по поллитре с индейцами. если найдёшь IdAntiFreeze — это оно. если не найдёшь — значит, упразднили.

---
Understanding is not required. Only obedience.


 
bagos   (2008-02-09 14:55) [14]

Антифриз то что надо! спасибо за помощь!


 
guav ©   (2008-02-09 15:11) [15]

Прогрессбар при скачивании похоже у URLDownloadToFile прикрутить можно

unit DownWithProgress;

interface

uses Windows, ComObj, ActiveX, UrlMon;

function DownloadWithProgress(
   szURL: PChar;
   szFileName: PChar;
   parent: HWND): HRESULT;

implementation

const
 CLSID_ProgressDialog: TGUID = "{F8383852-FCD3-11d1-A6B9-006097DF5BD4}";

type
 IProgressDialog = interface(IUnknown)
   ["{EBBC7C04-315E-11d2-B62F-006097DF5BD4}"]
   function StartProgressDialog(
     hwndParent: HWND;
     punkEnableModless: IUnknown;
     dwFlags: DWORD;
     LpvResevered: Pointer): HRESULT; stdcall;
   function StopProgressDialog(): HRESULT; stdcall;
   function SetTitle(pwzTitle: PWideChar): HRESULT; stdcall;
   function SetAnimation(hInstAnimation: HMODULE; idAnimation: UINT): HRESULT; stdcall;
   function HasUserCancelled(): BOOL; stdcall;
   function SetProgress(dwCompleted: DWORD; dwTotal: DWORD): HRESULT; stdcall;
   function SetProgress64(ullCompleted: UInt64; ullTotal: UInt64): HRESULT; stdcall;
   function SetLine(dwLineNum: DWORD; pwzString: PWideChar;
     fCompactPath: BOOL; pvResevered: Pointer): HRESULT; stdcall;
   function SetCancelMsg(pwzCancelMsg: PWideChar; pvResevered: Pointer): HRESULT; stdcall;
   function Timer(dwTimerAction: DWORD; pvResevered: Pointer): HRESULT; stdcall;
 end;

const
 PROGDLG_NORMAL         = $00000000;
 PROGDLG_MODAL          = $00000001;
 PROGDLG_AUTOTIME       = $00000002;
 PROGDLG_NOTIME         = $00000004;
 PROGDLG_NOMINIMIZE     = $00000008;
 PROGDLG_NOPROGRESSBAR  = $00000010;

type
 TDownloadProgress = class(TInterfacedObject, IBindStatusCallback)
 private
   FDialog: IProgressDialog;
   FBininng: IBinding;
   FParent: HWND;
   FName: string;
 public
   constructor Create(Parent: HWND; Name: string);
 public
   function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
   function GetPriority(out nPriority): HResult; stdcall;
   function OnLowResource(reserved: DWORD): HResult; stdcall;
   function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
     szStatusText: LPCWSTR): HResult; stdcall;
   function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
   function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
   function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
     stgmed: PStgMedium): HResult; stdcall;
   function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
 end;

{ TDownloadProgress }

constructor TDownloadProgress.Create(Parent: HWND; Name: string);
begin
 FParent := Parent;
 FName := Name;
 FDialog := CreateComObject(CLSID_ProgressDialog) as IProgressDialog;
end;

function TDownloadProgress.GetBindInfo(out grfBINDF: DWORD;
 var bindinfo: TBindInfo): HResult;
begin
 grfBINDF := 0;
 Result := S_OK;
end;

function TDownloadProgress.GetPriority(out nPriority): HResult;
begin
 DWORD(nPriority) := THREAD_PRIORITY_NORMAL;
 Result := S_OK;
end;

function TDownloadProgress.OnDataAvailable(grfBSCF, dwSize: DWORD;
 formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
begin
 Result := S_OK;
end;

function TDownloadProgress.OnLowResource(reserved: DWORD): HResult;
begin
 Result := S_OK;
end;

function TDownloadProgress.OnObjectAvailable(const iid: TGUID;
 punk: IInterface): HResult;
begin
 Result := S_OK;
end;

function TDownloadProgress.OnProgress(ulProgress, ulProgressMax,
 ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
begin
 FDialog.SetProgress(ulProgress, ulProgressMax);
 if FDialog.HasUserCancelled() then
   FBininng.Abort();
 Result := S_OK;
end;

function TDownloadProgress.OnStartBinding(dwReserved: DWORD;
 pib: IBinding): HResult;
begin
 FBininng := pib;
 FDialog.StartProgressDialog(0, nil, PROGDLG_MODAL or PROGDLG_AUTOTIME, nil);
 FDialog.SetTitle("Downloading");
 FDialog.SetLine(1, PWideChar(WideString(FName)), False, nil);
 Result := S_OK;
end;

function TDownloadProgress.OnStopBinding(hresult: HResult;
 szError: LPCWSTR): HResult;
begin
 FDialog.StopProgressDialog();
 Result := S_OK;
end;

function DownloadWithProgress(
   szURL: PChar;
   szFileName: PChar;
   parent: HWND): HRESULT;
begin
 Result := URLDownloadToFile(
   nil, szURL, szFileName, 0,
   TDownloadProgress.Create(parent, szURL) as IBindStatusCallback);
end;

end.


 
palva ©   (2008-02-09 15:15) [16]


> guav ©   (09.02.08 15:11) [15]

Вот спасибо, нравятся мне такие технологии.


 
bagos   (2008-02-09 16:13) [17]

guav, спасибо за вкуснятину


 
guav ©   (2008-02-09 20:38) [18]

> [16] palva ©   (09.02.08 15:15)
> [17] bagos   (09.02.08 16:13)

Только там проверить всё надо, это наскоро написаный пример.
И ещё проблема может быть здесь

> if FDialog.HasUserCancelled() then

проверяется  только в OnProgress, т.е. если скачка зависнет то отмена может перестать работать.



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

Текущий архив: 2008.03.02;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.034 c
2-1202286260
saNat
2008-02-06 11:24
2008.03.02
Чтение количество страниц в документе Word


2-1202062927
batya-x
2008-02-03 21:22
2008.03.02
TbitMap и function


2-1202485682
Ksanf
2008-02-08 18:48
2008.03.02
Обход графа


15-1201632004
timeout
2008-01-29 21:40
2008.03.02
UUID компьютера


15-1201617676
fics
2008-01-29 17:41
2008.03.02
Книга по Delphi