J'écris un programme qui doit télécharger un .exe
fichier à partir d'un site Web, puis enregistrez-le sur le disque dur. Le .exe
est stocké sur mon site et son URL est la suivante (ce n'est pas le vrai uri que j'ai composé aux fins de cette question):
http://www.mysite.com/calc.exe
Après de nombreuses recherches sur le Web et des exemples, voici le code que j'ai trouvé jusqu'à présent:
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(http://www.mysite.com/calc.exe);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream);
string s = streamReader.ReadToEnd();
Comme vous pouvez le voir, j'utilise la classe StreamReader
pour lire les données. Après avoir appelé ReadToEnd
le lecteur de flux contient-il le contenu (binaire) de mon .exe? Puis-je simplement écrire le contenu du StreamReader
dans un fichier (nommé calc.exe) et j'aurai téléchargé avec succès le .exe?
Je me demande pourquoi StreamReader
ReadToEnd
renvoie une chaîne. Dans mon cas, cette chaîne serait-elle le contenu binaire de calc.exe?
WebClient est la meilleure méthode pour télécharger un fichier. Mais vous pouvez utiliser la méthode suivante pour télécharger un fichier de manière asynchrone à partir du serveur Web.
private static void DownloadCurrent()
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("[url to download]");
webRequest.Method = "GET";
webRequest.Timeout = 3000;
webRequest.BeginGetResponse(new AsyncCallback(PlayResponeAsync), webRequest);
}
private static void PlayResponeAsync(IAsyncResult asyncResult)
{
long total = 0;
long received = 0;
HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState;
try
{
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult))
{
byte[] buffer = new byte[1024];
FileStream fileStream = File.OpenWrite("[file name to write]");
using (Stream input = webResponse.GetResponseStream())
{
total = input.Length;
int size = input.Read(buffer, 0, buffer.Length);
while (size > 0)
{
fileStream.Write(buffer, 0, size);
received += size;
size = input.Read(buffer, 0, buffer.Length);
}
}
fileStream.Flush();
fileStream.Close();
}
}
catch (Exception ex)
{
}
}
Il y a un fil similaire ici - comment télécharger le fichier en utilisant httpwebrequest
StreamReader est une implémentation de lecteur de texte, c'est-à-dire qu'il doit être utilisé pour lire des données texte et non des données binaires. Dans votre cas, vous devez utiliser directement le flux de réponse sous-jacent.
Pour télécharger un fichier, le moyen le plus simple serait d'utiliser la méthode WebClient.DownloadFile .
Cela devrait directement enregistrer le fichier sur votre disque dur.
using System.Net;
using (WebClient webClient = new WebClient ())
{
webClient.DownloadFile("http://www.mysite.com/calc.exe", "calc.exe");
}
Je suis probablement un peu en retard, mais j'ai eu le même problème avec des fichiers toujours gros de 0 Ko s'ils ne fonctionnaient pas en mode débogage. Cela pourrait être une réponse relativement simple, mais la désactivation de "DEBUG-Constants" sous Propriétés l'a résolu pour moi.
Au lieu d'utiliser StreamReader
, vous devriez vraiment appeler la méthode Read()
de votre objet Stream
. Cela vous demandera de remplir un tampon d'octets [] avec des données lues, que vous pourrez ensuite écrire sur le disque en utilisant StreamWriter
ou FileStream
.