Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2011, 00:33   #1
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию Закачка файла на WinSock

Вообще пытался закачать файл с помощью такой функции
Код:
function DownloadFile(Host: String; Outfile:String): Integer;
var SockAddr1: TSockAddr;
    Socket1: TSocket;
    Buffer1: Ansistring;
    Buffer2:array[1..1024] of Ansichar;
    info: WSADATA;
    NewFile: file;
    iRead: Integer;
begin
WSAStartup($202,info);
Buffer1:='GET /'+Host+' HTTP/1.1' + #13#10 +
'Host: google.ru' + #13#10 +
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + #13#10 +
'Accept-Language: ru,en-us;q=0.7,en;q=0.3' + #13#10 +
'Accept-Encoding: deflate' + #13#10 +
'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7' + #13#10 +
'Connection: close' + #13#10 +
'Cache-Control: max-age=0' + #13#10 +
#13#10;
Socket1:=Socket(AF_INET,SOCK_STREAM,0);
SockAddr1.sin_family:=AF_INET;
SockAddr1.sin_addr.S_addr:=inet_addr(PAnsiChar('127.0.0.1'));
SockAddr1.sin_port:=htons(80);
connect(Socket1, SockAddr1, sizeof(SockAddr1));
send(Socket1,Buffer1[1],Length(Buffer1),0);
AssignFile(NewFile, 'C:\11.txt');
Rewrite(NewFile,1);
 while (TRUE) do
 begin
  FillChar(Buffer2, SizeOf(Buffer2), 0);
  iRead:=Recv(Socket1, Buffer2, length(Buffer2), 0);
  BlockWrite(NewFile, Buffer2, iRead); //Вот здесь вываливается в ошибку I/O 998 Error
  if iRead<=0 then break;
 end;
CloseFile(NewFile);
CloseSocket(Socket1);
WSACleanup;
Result:=1;
end;
Погуглил, узнал, что это ошибка доступа к файлу, пытался как-то исправить, но увы не получилось. Помогите разобраться в чём может быть проблема.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 27.02.2011, 00:43   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Outfile:String // ет вроди имяя скоторым должен фаил сохраница, верно?
Host: String; // а ето?
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 27.02.2011, 00:50   #3
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
Outfile:String // ет вроди имяя скоторым должен фаил сохраница, верно?
Host: String; // а ето?
Host - это ссылка до файла без домена,
Outfile - не используется вообще, путь для сохранения C:\11.txt
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 27.02.2011, 01:06   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

http://vip-file.com/download/03416.0...rsdgt.txt.html
так?
download/03416.0b58629085755c56b80ea1477a5e/frsdgt.txt.html
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 27.02.2011, 01:10   #5
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
http://vip-file.com/download/03416.0...rsdgt.txt.html
так?
download/03416.0b58629085755c56b80ea1477a5e/frsdgt.txt.html
да так, только ещё в этой строке 'Host: google.ru' + #13#10 +
нужно заменить google.ru на vip-file.com
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 27.02.2011, 01:25   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

создало с таким вот фаилом, даи твою ссылку попробу не меняя твои код
Код:
HTTP/1.1 404 Not Found
Date: Sat, 26 Feb 2011 22:23:37 GMT
Server: Apache/2.2.15 (Win32) DAV/2 SVN/1.6.12
Content-Length: 351
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /download/03416.0b58629085755c56b80ea1477a5e/frsdgt.txt.html was not found on this server.</p>
<hr>
<address>Apache/2.2.15 (Win32) DAV/2 SVN/1.6.12 Server at vip-file.com Port 80</address>
</body></html>
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 27.02.2011, 01:33   #7
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

work.ucoz.ae/onefilm.txt
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 27.02.2011, 01:37   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

ошибку не выдает, но с тем же текстом качает
сколько раз етот цикл должен выполница при успешном скачивании, у меня ток 2 раза пробежался
while (TRUE) do
begin

end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 27.02.2011, 01:42   #9
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Попробуй передать переменной хост значение http://vip-file.com/download/03416.0...rsdgt.txt.html
мб так получится. Ещё можно попробывать сделать так host: 127.0.0.1
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 27.02.2011, 01:45   #10
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Стрелка

я слышал с чужих форумов сшлки нельзя вылаживать, значит к нам перенесу, вот даваи почитаем, мож разберемся

Скачиваем файлы из интернета
Задача: скачать файл по http в указанную папку с использованием потока.
Делаем форму
Бросаем на форму два TEdit, TProgressBar, одну кнопку и TSaveDialog.
Для кнопки пишем маленький обработчик:
Код:
//Этой строкой мы скопируем имя файла SaveDialog1.FileName:=copy(Edit1.Text,LastDelimiter('\⁄',Edit1.Text)+1,maxint); 
if SaveDialog1.Execute then 
  Edit2.Text:=SaveDialog1.FileName;
Теперь на форму добавим IdHTTP и кнопку (Button2) с надписью "начать закачку".
Делаем поток
С обработчиком пока повременим, а напишем самое сложное – класс для потока.
Код:
{$R *.dfm} 
//--------------------------------------- 
type 
  TDownLoader = class(TThread) 
  protected 
    procedure Execute; override; 
  public 
    property URL:string read FURL write FURL; 
    property ToFolder:string read FToFolder write FToFolder; 
end;
Первые две строки сделаны для того, чтобы было видно, где вписать код. И нажимаем Ctrl+Shift+C. Delphi допишет немного кода. Он теперь будет выглядеть так:
type 
  TDownLoader = class(TThread) 
  private 
    FToFolder: string; 
    FURL: string; 
  protected 
    procedure Execute; override; 
  published 
  public 
    property URL:string read FURL write FURL; 
    property ToFolder:string read FToFolder write FToFolder; 
  end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  SaveDialog1.FileName:=copy(Edit1.Text,LastDelimiter('\⁄',Edit1.Text)+1,maxint); 
  if SaveDialog1.Execute then 
    Edit2.Text:=SaveDialog1.FileName; 
end; 

{ TDownLoader } 

procedure TDownLoader.Execute; 
begin 
  //здесь мы начнём писать код работы 
end;
Компонент idHTTP был брошен на форму только с одной целью – чтобы Delphi добавила все заголовочные файлы в uses. Потом его можно будет удалить. Но можно и самостоятельно вписать в uses файл idHTTP.
Главный код потока
Итак, код обработчика:
Код:
procedure TDownLoader.Execute; 
var 
  http:TIdHTTP; 
  str:TFileStream; 
begin 
  //Создим класс для закачки 
  http:=TIdHTTP.Create(nil); 
  //каталог, куда файл положить 
  ForceDirectories(ExtractFileDir(ToFolder)); 
  //Поток для сохранения 
  str:=TFileStream.Create(ToFolder, fmCreate); 
  try 
    //Качаем 
    http.Get(url,str); 
  finally 
    //Нас учили чистить за собой 
    http.Free; 
    str.Free; 
end; 

end;
Помните, что в этой процедуре нельзя напрямую обращаться к компонентам формы и другим потокам. Это делается специальным образом, который называется синхронизацией.
Запускаем поток
И наконец, обработчик для кнопки:
Код:
procedure TForm1.Button2Click(Sender: TObject); 
var d:TDownLoader; 
begin 
  //Создадим класс потока. 
  //Поток для начала будет остановлен 
  d:=TDownLoader.Create(true); 
  //Передадим параметры потоку 
  d.URL:=Edit1.Text; 
  d.ToFolder:=Edit2.Text; 
  //Поток должен удалить себя по завершению своей работы  
  d.FreeOnTerminate:=true; 
  //И запустим его на закачку. 
  d.Resume; 
  //Теперь с процедуры мы выйдем, но поток работает 
  //и живёт своей жизней 
end;
Теперь наш код уже может качать, но у нас нет прогресса, нет уведомления о завершении закачки.
Дополнительные возможности
Добавим для начала уведомление о закачке. Добавим в public часть формы добавим строку:
Код:
public 
  { public declarations } 
  procedure thrTerminate(Sender:TObject); 
end;
и нажмём Ctrl+Shift+C.
Появится новый обработчик, который мы дополним одной строкой. Я вывожу просто сообщение о готовности. Помните, эта процедура будет вызваться, когда поток выполнит всю свою работу (завершится процедура Execute). Только в этой процедуре можно одновременно обращаться к компонентам формы и данным потока.
Код:
procedure TForm1.thrTerminate(Sender: TObject); 
begin 
  ShowMessage('Готово'); 
end;
И добавим её вызов в обработчике кнопки запуска:
Код:
//Поток должен удалить себя по завершению своей работы 
d.FreeOnTerminate:=true; 
d.OnTerminate:=thrTerminate;
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закачка-докачка файла в потоке, с прогрессом Alter Работа с сетью в Delphi 2 13.01.2011 12:06
Закачка файла из Интернета _SERGEYX_ Работа с сетью в Delphi 3 18.01.2010 14:21
Закачка файла происходит в отдельном потоке. Kyran29 Работа с сетью в Delphi 1 28.11.2009 01:19
закачка файла отдельным потоком. ZeitGeist7 Общие вопросы Delphi 12 26.02.2009 20:23
Закачка файла с ссылки Titan123 Работа с сетью в Delphi 5 20.10.2008 13:25