2009-06-14 8 views
19

En C# .NET, je veux extraire des données d'une URL et les enregistrer dans un fichier en binaire. Utiliser HttpWebRequest/Streamreader pour lire dans une chaîne et enregistrer en utilisant StreamWriter fonctionne bien avec ASCII, mais les caractères non-ASCII sont altérés parce que le système pense qu'il doit s'inquiéter des encodages, encoder en Unicode ou de ou autre.Comment obtenir des données à partir d'une URL et l'enregistrer dans un fichier binaire en C# .NET sans le désordre d'encodage?

Quel est le moyen le plus simple de GET des données à partir d'une URL et de l'enregistrer dans un fichier, binaire, tel quel?

// This code works, but for ASCII only 
String url = "url..."; 
HttpWebRequest request = (HttpWebRequest) 
WebRequest.Create(url); 

// execute the request 
HttpWebResponse response = (HttpWebResponse) 
request.GetResponse(); 

// we will read data via the response stream 
Stream ReceiveStream = response.GetResponseStream(); 
StreamReader readStream = new StreamReader(ReceiveStream); 
string contents = readStream.ReadToEnd(); 

string filename = @"..."; 

// create a writer and open the file 
TextWriter tw = new StreamWriter(filename); 
tw.Write(contents.Substring(5)); 
tw.Close(); 

Répondre

53

réponse Minimaliste:

using (WebClient client = new WebClient()) { 
    client.DownloadFile(url, filePath); 
} 

Ou dans PowerShell (proposé dans une édition anonyme):

[System.Net.WebClient]::WebClient 
$client = New-Object System.Net.WebClient 
$client.DownloadFile(URL, Filename) 
+0

Parfait juste ce dont j'avais besoin merci! – jms

+0

Serait bon s'il pouvait télécharger des fichiers gzippés? – Greg

+0

Ne serait-ce pas. –

13

N'utilisez pas StreamReader ou TextWriter. Enregistrer dans un fichier avec un FileStream brut.

String url = ...; 
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 

// execute the request 
HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

// we will read data via the response stream 
Stream ReceiveStream = response.GetResponseStream(); 

string filename = ...; 

byte[] buffer = new byte[1024]; 
FileStream outFile = new FileStream(filename, FileMode.Create); 

int bytesRead; 
while((bytesRead = ReceiveStream.Read(buffer, 0, buffer.Length)) != 0) 
    outFile.Write(buffer, 0, bytesRead); 

// Or using statement instead 
outFile.Close() 
+2

Ne pas oublie d'utiliser outFile.Close(). – Rios

+0

Merci, @Rios, ajouté (ou mieux encore 'using'). –

0

Voici ce que j'utilise:

sUrl = "http://your.com/xml.file.xml"; 
rssReader = new XmlTextReader(sUrl.ToString()); 
rssDoc = new XmlDocument(); 

WebRequest wrGETURL; 
wrGETURL = WebRequest.Create(sUrl); 

Stream objStream; 
objStream = wrGETURL.GetResponse().GetResponseStream(); 
StreamReader objReader = new StreamReader(objStream, Encoding.UTF8); 
WebResponse wr = wrGETURL.GetResponse(); 
Stream receiveStream = wr.GetResponseStream(); 
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8); 
string content = reader.ReadToEnd(); 
XmlDocument content2 = new XmlDocument(); 

content2.LoadXml(content); 
content2.Save("direct.xml"); 
Questions connexes