|
#1
|
||||
|
||||
Сетевой Stream =)
Есть ли какой нибудь исходник для работы с файлами которые находятся в интернете? Работать как с TStream, там Seek CopyFrom Read Write... нужно для многопоточной закачки файла, как в Download Master
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#2
|
||||
|
||||
Тебя разделом "Исходники" данного сайта пользоваться научить?
тут посмотри, похоже, то что тебе надо. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#3
|
||||
|
||||
Цитата:
зы: и нефига дутся, невывезбы я такое сразу TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#4
|
||||
|
||||
хм, люди памагите, хочу получить размер файла из интернета, пишу
Код:
var url,sess: HINTERNET; begin lblUrlSize.Caption := '0'; sess := InternetOpen('iexplorer',INTERNET_OPEN_TYPE_PRECONFIG, nil,nil,0); url := InternetOpenUrl(sess,pchar('http://'+edtUrl.Text),nil,0,0,0); try // working if(url=nil)then Exit; fs := InternetSetFilePointer(url,0,nil,FILE_END,0); lblUrlSize.Caption := FloatToStr(fs)+' bytes'; finally InternetCloseHandle(url); InternetCloseHandle(sess); end; Вот например файл со своего сайта (adworld.ucoz.ru/adworld_soft/quick_menu/QM_13.exe, весит 500 с лишним кб) он пооказывает цифру 4,294,967,295. Я ваще запутался, помогите TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#5
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#6
|
||||
|
||||
Я его всё таки сделал - Сетевой Stream
Тут вот посидел пол часика и сделал его, TNetStream! Для отцов паскаля это не новость, но для меня это маленькая победа . Кароче это потомок TStream, а значит теперь легко можно качать файлы из интернета или даже сделать подобие Download Master'а читая несколькими потоками один файл (функция Seek работает). Не буду жопить, вот исходник класса, создайте файл NetStream.pas в папке Delphi7\Lib и сохраните туда этот текст:
Код:
unit NetStream; interface uses Windows, WinInet, Classes; type EInternetStreamError = EStreamError; TNetStream = class(TStream) private fFile, fSession: HINTERNET; public constructor Create(AUrl: String; AUser: String = ''; APass: String = ''); destructor Destroy; override; function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(Offset: Longint; Origin: Word): Longint; overload;override; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; override; end; implementation constructor TNetStream.Create(AUrl: String; AUser: String = ''; APass: String = ''); begin inherited Create; fSession := InternetOpen(pchar('iexplorer'),INTERNET_OPEN_TYPE_PRECONFIG,nil, nil,INTERNET_FLAG_NEED_FILE); if(fSession=nil)then raise EInternetStreamError.Create('Session can''t create'); fFile := InternetOpenUrl(fSession,pchar(AUrl),nil,0,INTERNET_FLAG_NEED_FILE,0); if(fFile=nil)then raise EInternetStreamError.Create('File not found'); end; destructor TNetStream.Destroy; begin InternetCloseHandle(fFile); InternetCloseHandle(fSession); inherited Destroy; end; function TNetStream.Read(var Buffer; Count: Longint): Longint; var r: Cardinal; begin InternetReadFile(fFile,@Buffer,Count,r); Result := r; end; function TNetStream.Write(const Buffer; Count: Longint): Longint; var r: Cardinal; begin InternetWriteFile(fFile,@Buffer,Count,r); Result := r; end; function TNetStream.Seek(Offset: Longint; Origin: Word): Longint; var mm: Cardinal; begin case Origin of soFromBeginning: mm := FILE_BEGIN; soFromCurrent: mm := FILE_CURRENT; soFromEnd: mm := FILE_END; else mm := FILE_CURRENT; end; Result := InternetSetFilePointer(fFile,Offset,nil,mm,0); end; function TNetStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; var mm: Cardinal; begin case Origin of soBeginning: mm := FILE_BEGIN; soCurrent: mm := FILE_CURRENT; soEnd: mm := FILE_END; else mm := FILE_CURRENT; end; Result := InternetSetFilePointer(fFile,Offset,nil,mm,0); end; end. TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#7
|
||||
|
||||
и снова помогите, со всем что выше мною написано разобрался, теперь проблема в следующем: качаю файл... приостановил, потом при возобновлении он долго думает и минуты через 2 начинает докачивать, в DM он намного шустрее думает, есть решение?
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |