как сделать Updater

  • Автор темы IY@KOV
  • Дата начала
I

IY@KOV

#1
Подскажите пожалуйста:

У меня есть список файлов. Как мне реализовать их Скачивание из интернета (зная их адрес) на локальный (компьютер пользователся) компьютер???

какой класс использовать? ничего не находится. заранее спасибо
 
N

NikSoft

#2
Для: IY@KOV
Как мне реализовать их Скачивание из интернета (зная их адрес)
Если речь идет об html файлах, то можно использовать HttpWebRequest класс
(http://msdn2.microsoft.com/en-us/library/system.net.httpwebrequest(vs.80,d=printer).aspx).
Код,реализующий считывание html файла, приводится ниже.

Код:
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Text;
using System.Text.RegularExpressions;

namespace Parser
{
public class InternetAffair
{
CookieContainer _requestCookieContainer = new CookieContainer();

#region Properties
public CookieContainer RequestCookieContainer
{
get { return _requestCookieContainer; }
}

#endregion

#region Methods

public string getHTML(string requestURI)
{
HttpWebResponse httpWebResponse = null;
string		 response = "";

try
{
HttpWebRequest httpWebRequest  = (HttpWebRequest)WebRequest.Create(requestURI);
httpWebRequest.Timeout		 = Constants.HttpWebRequestMinTimeOut;
httpWebRequest.UserAgent		= Constants.UserAgent;
httpWebRequest.Referer		 = Constants.Referer;
httpWebRequest.CookieContainer = RequestCookieContainer;

httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

if (httpWebResponse.StatusCode != HttpStatusCode.OK)
{
httpWebResponse.Close(); // Releases the resources of the response.
ColorConsole.WriteLine(ConsoleColor.White, String.Format("\nWebException\ngetHTML() resp.StatusCode: {0}", httpWebResponse.StatusCode.ToString()));
}
else
{
StreamReader receiveStream = new StreamReader(httpWebResponse.GetResponseStream());
response = receiveStream.ReadToEnd();
receiveStream.Close();
}
}
catch (System.Net.WebException we)
{
ColorConsole.WriteLine(ConsoleColor.White, String.Format("\nWebException\ngetHTML() function: {0}\nMessage: {1}", requestURI, we.Message));
response = Constants.ErrorPage;
}
finally
{
if (httpWebResponse != null)httpWebResponse.Close();
}

return response;
}

#endregion
}
}
Пример использования InternetAffair класса

Код:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
using ParserOfCostkaLib;
using System.Xml;
using System.IO;
using ParserOfCostkaLib.DAL;

namespace Parser
{
public class CreateParser
{
#region Private Members
string		 _sourseOfParsing;
// ...
#endregion

#region Properties
public string SourseOfParsing
{
get { return _sourseOfParsing; }
set { _sourseOfParsing = value; }
}
// ...
#endregion

#region Methods
public CreateParserCategories()
{
SourseOfParsing = ConfigurationManager.AppSettings["UrlOfRootCategoryAspx"];
// ...
}

public void DoIt()
{
try
{
InternetAffair internetAffair = new InternetAffair();
string sourceHTML = internetAffair.getHTML(SourseOfParsing);

// Строка sourceHTML содержит текст считанного html файла
// Сейчас его можно каким-то образом обработать или сохранить на диск локальной машины

}
catch (XmlException xmlException)
{
ColorConsole.WriteLine(ConsoleColor.White, String.Format("\nXmlException\nLineNumber: {0}\nLinePosition:\n {1} \nMessage: {2}", xmlException.LineNumber, xmlException.LinePosition, xmlException.Message));
}
catch (Exception e)
{
ColorConsole.WriteLine(ConsoleColor.White, String.Format("\nException\nMessage:\n {0} \nStackTrace:\n {1}", e.Message, e.StackTrace));
}
finally
{
sgmlReader.Close();
}
}
// ...

#endregion
}
}
Код:
using System;
using System.Collections.Generic;
using System.Text;

namespace Parser
{
public static class ColorConsole
{

public static void WriteLine(ConsoleColor color, string textToWrite)
{
Console.ForegroundColor = color;
Console.WriteLine(textToWrite);
Console.ResetColor();
}

public static void BackColor(ConsoleColor color)
{
Console.BackgroundColor = color;
}
}	

}
Код:
using System;
using System.Collections.Generic;
using System.Text;

namespace Parser
{
public sealed class Constants
{
static public readonly string  UserAgent = "Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1;+Q312461)";
static public readonly string  Referer = "";
static public readonly int	 HttpWebRequestMinTimeOut = 2 * 60 * 1000;
// ...

}

}
Вот еще ссылка http://msdn2.microsoft.com/en-us/library/s...d=printer).aspx


Для: IY@KOV
Надо изменить имя конструктора CreateParserCategories на CreateParser. Это опечатка.
 
N

NikSoft

#4
Для: IY@KOV
К сожалению, я не работал с System.Net.WebClient.OpenRead.
Но что тебе мешает поэкспериментировать?
 
I

IY@KOV

#7
О! большое спасибо)

Мне нужно скачивать любые файлы.
У меня есть еще вопрос. Когда я использую System.Net.WebClient.OpenRead, то почему-то если я читаю и записываю по порции байтов, то файл сохраняются неправильно. Вот так работает:
Код:
				using(Stream data = (new WebClient()).OpenRead(uriServerFile))
using(FileStream ts = new FileStream(uriClient, FileMode.Create))
{
int i = -1;
byte[] b = new byte[1];
while(i!=0)
{
i = data.Read(b, 0, 1);
ts.WriteByte(b[0]);
}
ts.Flush();

}
И еще вопросик
С помощью какого класса можно узнать размер файла в интернете (т.е. не на компе, где запускается прог-а)
 
N

NikSoft

#8
Для: IY@KOV
С помощью какого класса можно узнать размер файла в интернете
Как насчет этого кода?
Код:
WebRequest myWebRequest=WebRequest.Create("uriServerFile");
WebResponse myWebResponse = myWebRequest.GetResponse();
long i = myWebResponse.ContentLength;
myWebResponse.Close();