![]() |
|
|
#1
|
||||
|
||||
|
Есть ли какой нибудь исходник для работы с файлами которые находятся в интернете? Работать как с TStream, там Seek CopyFrom Read Write... нужно для многопоточной закачки файла, как в Download Master
|
|
#3
|
||||
|
||||
|
Цитата:
зы: и нефига дутся, невывезбы я такое сразу |
|
#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. Я ваще запутался, помогите |
|
#5
|
||||
|
||||
|
Цитата:
он пряммые ссылки на файл не даёт |
|
#6
|
||||
|
||||
|
Тут вот посидел пол часика и сделал его, 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.![]() |
|
#7
|
||||
|
||||
|
и снова помогите, со всем что выше мною написано разобрался, теперь проблема в следующем: качаю файл... приостановил, потом при возобновлении он долго думает и минуты через 2 начинает докачивать, в DM он намного шустрее думает, есть решение?
|